常见排序算法总结

Posted by 大雁小鱼的博客 on May 29, 2018

快速排序

快速排序是一种相比冒泡排序更加高效的排序算法。

参考网址:http://www.cnblogs.com/foreverking/articles/2234225.html
参考网址:http://developer.51cto.com/art/201403/430986.htm

最坏时间复杂度: 平均时间复杂度:

常见场景

  1. 海量数据 一年的全国高考考生人数为500万,分数使用标准分,最低100分,最高900分,没有小数,要求对这500万元素进行排序。

分析:对500W数据排序,如果按一般的复杂度比较低的排序,平均比较次数5000000*log5000000=1.112亿。但我们发现这些数据有特殊性,100<=score<=900 所以可以考虑痛排序这种“投机取巧”的方法,让其在较短的比较次数下完成排序。

方法:创建801个桶,将每个考生的分数丢进去,这个过程从头遍历至尾只需要500W次。然后根据桶号大小依次将桶中的数值输出,即可得到一个有序序列。同时我们还可以得到100分有几人,101分有几人这样的信息。

注意,桶排序对数据有特殊要求,比如上面的分数如果不是100-900,而是0-2亿,那么分配2亿个桶显然是不可能的。所以桶排序有其局限性,适合元素集合不大的情况。

代码

    /**
     * 快速排序
     *
     * @param num
     * @param left
     * @param right
     */
    public static void quickSort(int[] num,int left,int right){
        if(left >=right){
            return ;
        }
        int i = left;
        int j = right;
        int temp = num[left];//拿到基准值
        while(i!=j){
            while(i<j && num[j]>=temp){
                //比基准值大
                j--;
            }
            if(j>i){
                num[i] = num[j];
            }

            while(i<j && num[i]<=temp){
                i++;
            }

            if(i<j){
                num[j] = num[i];
            }
        }

        num[i] = temp;
        //递归左边
        quickSort(num,left,i-1);
        //递归右边
        quickSort(num,i+1,right);
    }

冒泡排序

冒泡排序是一种理解容易,但复杂度比较高的排序算法。
冒泡排序的基本思想是:每次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来。

参考网址:http://blog.51cto.com/ahalei/1364401

时间复杂度:

代码

    /**
     * 冒泡排序
     * @param nums
     */
    public static void bubbleSort(int[] nums){
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]>nums[j]){
                    nums[i] ^= nums[j];
                    nums[j] ^= nums[i];
                    nums[i] ^= nums[j];
                }
            }
        }
    }

直接插入排序

直接插入排序是一种简单的排序算法,其过程是依次将每个元素插入到一个已经有序的序列中去。

void insertSort(int R[] int n){
    int i,j;
    int temp;
    for(i=1;i<n;i++){
        temp = R[i];//从第2个元素开始
        j=i-1;
        while(j>=0 && temp<R[j]){
            R[j+1] = R[j];
            j--;
        }
        R[j+1] = temp;
    }
}

直接插入排序是稳定的,最坏时间复杂度是