排序算法总结[2]_冒泡、直接插入和希尔排序

排序算法总结[2]

标签(逗号分隔): 排序、算法、Java


一、冒泡排序

冒泡排序是最简单的排序算法了,基本思路是:相邻元素两两比较,每次得出一个最大(最小)的冒出即可

  • 时间复杂度:
    平均和最坏是:O(N^2)
    最好是:O(N)---算法需要改进,记录每次要不要交换即可
  • 空间复杂度:O(1)
  • 稳定性:稳定
  • 冒泡排序效率极其低下,在数据量很小的时候拿来玩玩还可以
void bubbleSort(int[] arr]){
    if(arr==null)throw new NullPointerException();
    if(arr.length<2)return;
    boolean didSwap;
    for(int i=arr.length-1;i>0;--i){
        didSwap=false;
        for(int j=0;j<i;++j){
            if(arr[j]>arr[j+1]){
                int tmp=arr[j];
                arrr[j]=arr[j+1];
                arr[j+1]=arr[j]; //避免函数调用以提高效率
                didSwap=true;
            }
        }
        if(didSwap==false)return;//不需要再比较了
    }
}

二、插入排序

在数据量不大的时候可以使用插入排序,基本思路是:将数组看做已排序区域和未排序区域,每次从未排序区域取一个数据插入排序区域的正确位置即可。

  • 时间复杂度:
    最坏和平均:O(N^2)
    最好是:O(N),输入是排序的数据,每次只需和前一个元素比较即可
  • 空间复杂度:O(1)
  • 稳定性:稳定
  • 使用:在优化快排的一种策略中,就是选择在数据量较小(n<10)时使用插入排序来完成即可。**
void insertSort(int[] arr){
    if(arr==null)throw new NullPointerException();
    if(arr.length<=1)return;
    for(int i=1;i<arr.length;i++){
        int j,tmp=arr[i];
        for(j=i;j>0 && arr[j-1]>tmp;--j){
            arr[j]=arr[j-1]; //插入到前面正确的位置上
        }
        arr[j]=tmp;
    }
}

三、希尔排序

希尔排序又称为缩小增量排序,基本思路:选定一个由大到小的增量序列,每次以一个增量为基准使用直接插入排序。
根据选定的增量序列,时间复杂度可能会不同:
参考:《数据结构与算法分析_C语言描述》 P170 作者:Mark Allen Weiss

  • Hibbard序列的最坏时间复杂度是:O(N^(3/2))
  • Sedgwick提出了其他的序列,最坏可以达到O(N^(4/3))
    下面是一个参考代码:
posted @ 2016-09-19 11:01  山月记  阅读(288)  评论(3编辑  收藏  举报