八大排序

1.冒泡排序

一组无序数组,从后面往前进行两个数的交换,如果后面的数小于前面的数就交换,直到将最小的数换到最前面。

public class Main{
    public static void main(String[] args) {
        int[] a=new int[]{23,4,67,56,87,6,13,25,44,0};
        bubbleSort(a);
        System.out.println(Arrays.toString(a));
    }

    public  static void bubbleSort(int[] a) {
        for(int i=0;i<a.length-1;i++){
            for(int j=a.length-1;j>i;j--){
                if(a[j]<a[j-1]){
                    int temp=a[j];
                    a[j]=a[j-1];
                    a[j-1]=temp;
                }
            }
        }
    }

}

 

 

 

2.插入排序

假设前Ñ个数为已排状态,依次往后将后面的数插入到前面来保证前Ñ个数一直为已排状态。

public class Main{
    public static void main(String[] args) {
        int[] a=new int[]{23,4,67,56,87,6,13,25,44,0};
        insertSort(a);
        System.out.println(Arrays.toString(a));
    }

    private static void insertSort(int[] a) {
        for(int i=0;i<a.length-1;i++){
            for (int j=i+1;j>0;j--){
                if(a[j]<a[j-1]){
                    a[j-1]=a[j];
                }
                
            }

        }
    }
}

 

3.希尔排序 

比较相同间距的元素来排序,每一个周期的间距都会减小直到比较相邻的两个数

 

public class Main{
    public static void main(String[] args) {
        int[] a=new int[]{23,4,67,56,87,6,13,25,44,0};
        shellSort(a);
        System.out.println(Arrays.toString(a));
    }

    private static void shellSort(int[] a) {
        for(int gap=a.length/2;gap>0;gap=gap/2){
            for(int i=gap;i<a.length;i++){
            
                for (int j=i;j>i;j=j-gap){
                    if(a[j]<a[j-gap]){
                        a[j]=a[j-gap];
                    }

                }
                }

            }
        }
    }

 

 

4.选择排序

在无序数组中,第一次将第一个后面数中最小的数和第一个数交换,

第二次将第二个数后面中最小的数的与第二个数交换

依次类推

public class Main{
    public static void main(String[] args) {
        int[] a=new int[]{23,4,67,56,87,6,13,25,44,0};
        selectSort(a);
        System.out.println(Arrays.toString(a));
    }

    public  static void selectSort(int[] a) {
        for(int i=0;i<a.length;i++){

            int minIndex=i;
            for(int j=i+1;j<a.length;j++){

                if(a[j]<a[minIndex]){
                    minIndex=j;
                }
            }
            if(i!=minIndex){
                int temp=a[i];
                a[i]=a[minIndex];
                a[minIndex]=temp;
            }

        }
    }

}

 

 

 

5.快速排序

挖数填坑

取出一个密钥值(一般是第一个),把比它小的值放在它的左边,比它大的数放在它的右边。然后按照此方法,排列它左右两个子列,以此类推。

public class Main{
    public static void main(String[] args) {
        int[] a=new int[]{23,4,67,56,87,6,13,25,44,0};
        int l=0;
        int r=a.length-1;
        quck_Sort(a,l,r);
        System.out.println(Arrays.toString(a));
    }

    private static void quck_Sort(int[] a,int l,int r) {
        if (r>=l){return;}
        int i=r;
        int j=l;
        int key=a[l];

        while(i<j){
            while (i<j&&a[j]>=key){
                j--;
            }
            if(i<j){
                a[i]=a[j];
                i++;
            }
            while(i<j&&a[i]<key){
                i++;
            }
            if (i<j){
                a[j]=a[i];
                j--;
            }
            }
            a[i]=key;
            quck_Sort(a,l,i-1);
            quck_Sort(a,i+1,l);
    }
}

 

6.归并排序

将数组平分成左右两组,再每组数分成左右两组,利用递归直到将整个数组分成每组只有一个数的数组,每个数组就可看成一个有序数组,然后将其中两两进行有序归并为一组,放在临时数组中,(对比每组的第一个数,小的放第一个,然后另一组的第一个数放第二个中,依次往后)。

public class Main {


    public static void main(String[] args) {
        int[] a={23,4,67,56,87,6,13,25,44,0};
        int first=0;
        int last=a.length-1;
        int[] temp=new int[a.length];
        merge_Sort(a,first,last,temp);
        System.out.println(Arrays.toString(a));

    }
    static void merge_Sort(int[] a,int first,int last,int[] temp){
        if(first<last) {
            int middle = (first + last) / 2;
            merge_Sort(a,first,middle,temp);
            merge_Sort(a,middle+1,last,temp);
            mergeArray(a,first,middle,last,temp);
        }
    }


     static void mergeArray(int[] a, int first, int middle,int end, int[] temp) {
        int i=first;
        int m=middle;
        int j=middle+1;
        int k=0;
        int n=end;
        while(i<=m&&j<=n) {
            if (a[i] <= a[j]) {
                temp[k] = a[i];
                k++;
                i++;
            } else {
                temp[k] = a[j];
                k++;
                j++;
            }
        }
            while(i<=m){
                temp[k]=a[i];
                k++;
                i++;
            }
            while(j<=n){
                temp[k]=a[j];
                k++;
                j++;
            }

        for(int ii=0;ii<k;ii++){
            a[first+ii]=temp[ii];
        }
    }
}

 

 

 

7.基数排序

先新一个0〜9的基数数组,第一轮将无序数组按照末数放在基数的相应数字下面,第二轮将无序数组按照倒数第二位数放在基数的相应数字下面。

public class Main{
public static void main(String[] args){
    int[] a={23,4,67,56,87,6,13,25,44,0};
    int k=2;//未排数组的位数
    int r=10;//基数数组中有10个空间即10个箱子
    int[] cnt=new int[r];//基数数组
    int[] temp=new int[a.length];
    radixSort(a,k,r,cnt,temp);
    System.out.println(Arrays.toString(a));
        }

    public static void radixSort(int[] a,int k,int r,int[] cnt,int[] temp) {

    for(int i=0,rtok=1;i<k;i++,rtok=rtok*r){
        //初始化
        for(int j=0;j<r;j++){
            cnt[j]=0;
        }
        //计算每个箱子里面存放多少数字
        for(int j=0;j<a.length;j++){
            cnt[(a[j]/rtok)%r]++;
        }
        //将从cnt[j]的个数修改为前j个箱子里有多少个数字。
        for(int j=1;j<r;j++){
            cnt[j]=cnt[j-1]+cnt[j];
        }
        //首先每个箱子里面存放了前j个箱子里的数字个数,
        //按照原数组从后往前将箱子里面的数取出来放进临时数组,并且该箱子里面的数字减少1个。
        for(int j=a.length-1;j>0;j--){
            cnt[(a[j]/rtok)%r]--;
            temp[cnt[(a[j]/rtok)%r]]=a[j];//为了将a[j]放到合适的位置。
        }
        for(int j=0;j<a.length;j++){
            a[j]=temp[j];
        }
    }
    }
}

 

8.堆排序(以升序为例)

先将无序数组构造成大顶堆,再将首尾数字交换,此时末尾的数字是最大的,再将剩下的数字调整使其满足大顶堆,继续调换第一个和倒数第二个数,此时倒数第二个数是次大的,再将剩下的数字调整使其满足大顶堆,依次类推

public class Main{
    public static void main(String[] args) {
        int[] arr={28,23,42,1,54,22,77,55,4};
        heap_Sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void heap_Sort(int[] arr){
        for (int i=arr.length/2-1;i>=0;i--){
            adjustHeap(arr,i,arr.length);
        }
        for (int j=arr.length-1;j>0;j--){
            swap(arr,0,j);
            adjustHeap(arr,0,j);
        }
    }

    private static void swap(int[] arr, int a, int b) {
        int temp=arr[a];
        arr[a]=arr[b];
        arr[b]=temp;
    }

    private static void adjustHeap(int[] arr,int i,int length) {
        int temp=arr[i];
        for (int k=2*i+1;k<length;k=2*k+1){

            if (k+1<length&&arr[k]<arr[k+1]){
                k++;
            }
            if (arr[k]>temp){
                arr[i]=arr[k];
                i=k;//在这不需要进行交换
            }
            else{
                break;
            }
            }
            arr[i]=temp;
    }
}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值