常见排序算法

64 阅读2分钟

一、插入排序

我们可以把第一个数字看成一个有序数列,从第二个开始循环遍历。在遍历的途中在定义一个循环,不断的与前面的有序数列进行比较,找到位置之后结束本次循环,并将数字插入到有序数列中去,从而达成目的。

代码实现:

    public static void insertSort(int[] array) {
        for(int i=1;i< array.length;i++){
            int j=0;
            int temp=array[i];
            for(j=i-1;j>=0;j--){
                if(temp<array[j]){
                    array[j+1]=array[j];
                }else {
                    break;
                }
            }
            array[j+1]=temp;
        }
    }
1234567891011121314

时间复杂度:最坏的情况下为O(N^2),此时整个数列接近逆序。最好情况下为O(N),此时整个数列接近有序。

空间复杂度:O(1);

稳定

插入排序越有序,时间效率越高。

二、 希尔排序

1.先选定一个小于length的整数key作为第一增量,然后将所有距离为key的元素分在同一组,并对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量(我们一般是除2),重复整个操作。 2.当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。

代码实现:

    public static void insertSort(int[] array,int val) {
        for(int i=val;i< array.length;i++){
            int j=0;
            int temp=array[i];
            for(j=i-val;j>=0;j-=val){
                if(temp<array[j]){
                    array[j+val]=array[j];
                }else {
                    break;
                }
            }
            array[j+val]=temp;
        }
    }
 
    public static void shellSort(int[] array) {
        int key=array.length;
        while (key>0){
            key=key/2;
            insertSort(array,key);
        }
    }
12345678910111213141516171819202122

时间复杂度:最坏的情况下为O(N2)。最好情况下为O(N),此时整个数列接近有序。平均的情况下为O(N1.3)左右。

空间复杂度:O(1);

不稳定

三、选择排序

思路:

选择排序就是确定一个数组的最小值之后将它固定在起始位置,然后继续循环确定,直到完成为止。

代码实现:

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

代码优化:

    public static void selectSort01(int[] array) {
        for(int i=0;i<array.length;i++){
            int tmp=i;//把最小的放入tmp中,进行交换
            for(int j=i+1;j<array.length;j++){
                if(array[tmp]>array[j]){
                    tmp=j;
                }
            }
            int temp=array[i];
            array[i]=array[tmp];
            array[tmp]=temp;
        }
    }
12345678910111213

时间复杂度:O(N^2);

空间复杂度:O(1);

不稳定

四、冒泡排序

思路:

通过比较j和j+1的值来进行交换,将最大的值锁定在最后一个,进行循环。

代码实现:

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

代码优化:

    public static void bubbleSort02(int[] array) {
        for(int i=0;i<array.length;i++){
            boolean b=false;
            for(int j=0;j<array.length-1-i;j++){
                if(array[j]>array[j+1]){
                    int temp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                    b=true;
                }
            }
            if(b==false){
                break;
            }
        } 
    }
12345678910111213141516

时间复杂度:O(N^2);

空间复杂度:O(1);