排序

时间复杂度 O(lgn) 的通用算法

Divide and Conquer

  • quick sort
  • merge sort

这两者的思想很像:前者是选取一个 pivot,把数组分为两部分,再分治两部分即可。因为选取的 pivot 可能不能很好等分数组,最差的情况下时间复杂度是 O(n^2);后者是将数组等分为两部分,分别排序后再 merge,数组的话 merge 的时候还要 O(n) 的空间保存 merge 的新数组。

  • binary tree sort: 构造一棵二叉搜索树,然后中序遍历得到的就是排序好的数组
  • heap sort: 构造最小(大)堆,构造好后,不断取出堆顶元素即可

特定情景下时间复杂度 O(n) 的算法

Counting sort[1]

适合待排序数分布在一个小区间内。当待排序数是 n 个 0 到 k 之间的整数时,它的时间复杂度是 Θ(n+k)。维基百科上的那个解法需要 O(n+k),下面这种写法可以 in place。

public void countSort(int[] nums, int k) {
    int[] counts = new int[k+1];
    for (int i = 0; i < nums.length; i++) {
        counts[nums[i]]++;
    }
    int i = 0, j = 0;
    while (i < counts.length) {
        if (counts[i] == 0) {
            i++;
            continue;
        }
        nums[j++] = i;
        counts[i]--;
    }
}

Bucket sort

假设 n 个数分布在 [A, B] 内,把这个区间等分成 k 个桶,则每个数都落在某个桶内。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后从不是空的桶子里把数再放回原来的序列中。这种算法适合数在区间上均匀分布的情形,这样每个桶内的元素就是 n / k 个,对桶内元素排序时间是 O(1),整个桶排序时间复杂度 O(n+k)。


  1. https://zh.wikipedia.org/wiki/%E8%AE%A1%E6%95%B0%E6%8E%92%E5%BA%8F

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,237评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,753评论 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,288评论 0 2
  • ❤心享事成 ❤今日心享~享受声音 耳朵,不是用来听负面的, 而是用来享受爱,享受光的! 当我听到赞美时,我会带着笑...
    axjl如意阅读 158评论 0 0
  • 下面是关于f9手机碰到问题后怎么解决,请大家收藏,与到具体问题后参照操作 1、宇飞来F9手机有新的系统版本升级时应...
    吴若熙阅读 23,894评论 0 0