冒泡排序

前后两两对比进行交换,每轮至少一个数组变得有序(未排序的最大数值找到正确位置)

代码:

package Test20250206;

public class BubbleSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr= {2,3,9,4,5,7,0,1};
        sort(arr);
        for(int i=0;i<arr.length;i++) {
            System.out.print(arr[i]+",");
        }
    }
    static void sort(int[] arr) {
        for(int j=0;j<arr.length-1;j++) {
            for(int i=0;i<arr.length-1;i++) {
                if(arr[i]>arr[i+1]) {
                    int temp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=temp;
                }
            }
        }
    }

}

堆排序

流程(从根到叶):

事实上在数组里操作,没有构建二叉树

父子节点之间的规律:

代码:

package Test20250206;

import java.util.Arrays;

public class HeapSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr= {2,3,9,4,5,7,1,0};
        for(int p=arr.length-1;p>=0;p--) {
            sort(arr,p,arr.length);
        }
        for(int i=arr.length-1;i>0;i--) {
            int temp=arr[i];
            arr[i]=arr[0];
            arr[0]=temp;//堆顶元素和堆底元素进行互换
            sort(arr,0,i);
        }
        System.out.print(Arrays.toString(arr));
    }
    public static void sort(int[] arr,int parent,int le) {
        int temp=arr[parent];//temp作为父节点
        int lChild=2*parent+1;//左孩子
        while(lChild<le) {
            int rChild=lChild+1;//右孩子
            if(rChild<le&&arr[lChild]<arr[rChild]) {
                lChild++;//右孩子大于左孩子则把左孩子替换为右孩子
            }
            if(temp>=arr[lChild]) {
                break;//父节点值大于孩子节点则直接结束
            }
            arr[parent]=arr[lChild];//把孩子节点的值赋给父节点
            parent=lChild;
            lChild=2*lChild+1;
        }
        arr[parent]=temp;
    }

}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐