排序总结(详细)

目录 

一:插入排序

1)直接插入排序insertSort

2)希尔排序shellSort

二:选择排序

1)选择排序selectSort

2)堆排序heapSort

三:直接排序

1)冒泡排序

2)快速排序

四:归并排序


一:插入排序

1)直接插入排序insertSort

插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。 按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序 。

思路:将一组待排序的序列,第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。

public class insertSort {
    public static void insertSort (int[] arr){
     for(int i=1;i<arr.length;i++){
         int key = arr[i];
         int end=i-1;
         while(end>=0 && arr[end]>key){//注意:因为&&逻辑运算符具有短路特性,左端条件为假直接不成立,因此顺序不可变
             arr[end+1] = arr[end];//把end处位置放到后面,实现交换的一半
             end--;
         }
         arr[end+1]=key;//此时end+1处也就是arr(i-1)处,上方只交换了一半,完成下一半
     }
    }
    public static void printArray(int[] array){
        for(int i=0;i< array.length;i++){
            System.out.print(array[i]+" ");
        }
    }
    public static void main(String[] args) {
        int[] array ={12,11,23,25,22,36};
        insertSort(array);
        printArray(array);
    }
}

空间复杂度:o(1),没有多余的空间

时间复杂度:o(N^2) 。

最优有序或者接近有序o(N),只用外部循环,数据量小;最差比较乱,随机

应用场景:数据量比较小或者接近有序

稳定性:稳定

2)希尔排序shellSort

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;

思路:希尔排序是将待排序的数组元素 按下标一定增量分组 ,分成多个子序列,然后对各个子序列进行直接插入排序算法排序;然后依次缩减增量再进行排序,直到增量为1时,进行最后一次直接插入排序,排序结束。

//2)希尔排序
    public static void shellSort(int[] array){
        int gap = array.length;
        while(gap>0){
            gap=gap/3+1;
            for(int i=gap;i<array.length;i++){
                int key = array[i];
                int end = i-gap;

                while(end>= 0 && key < array[end]){
                    array[end+gap] = array[end];
                    end -= gap;
                }
                array[end+gap] = key;
            }
            gap--;
        }
    }

空间复杂度:o(1),没有多余的空间

时间复杂度:希尔排序的时间复杂度与增量(即,步长gap)的选取有关。例如,当增量为1时,希尔排序退化成了直接插入排序,此时的时间复杂度为O(N²),而Hibbard增量的希尔排序的时间复杂度为O(N3/2)。虽然有很多论文专门研究过不同的增量对希尔排序的影响,但都无法证明某个增量是最好的。

1) 最好情况:序列是正序排列,在这种情况下,需要进行的比较操作需(n-1)次。后移赋值操作为0次。即O(n)
2) 最坏情况O(n^2)。

应用场景:数据量大且接近凌乱

稳定性:不稳定

一个排序算法是否稳定就看是否有间隔的排序,间隔一定不稳定。稳定即排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同

二:选择排序

1)选择排序selectSort

选择排序是一种简单直观的排序算法

第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。 以此类推,直到全部待排序的数据元素的个数为零。

1)从arr[0]开始排
public static void selection_sort(int[] arr) {
        int len = arr.length-1;
        for (int i = 0; i < len ; i++) {
            int min = i;
            for (int j = i + 1; j <= len; j++)
                if (arr[min] > arr[j]){//两两比较找到最小的
                    min = j;
                }
            swap(arr,i,min);
        }
    }
2)从最后一个开始排 
public static void selectSort(int[] arr){
        int end = arr.length-1;
        while(end>0){
            int pos=0;
            for(int i=0;i<=end;i++){//循环遍历找到最大的一个数
                if(arr[pos]<arr[i]){
                    pos=i;
                }
            }
            if(pos!=end){//如果最大的不等于end,则交换
                swap(arr,pos,end);
            }
            end--;//end减去已经排好的这个,再继续找
        }
    }

空间复杂度:o(1),没有多余的空间

时间复杂度:o(N^2)

1) 最好情况:o(N^2)
2) 最坏情况o(N^2)

应用场景:无

稳定性:不稳定

<
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值