有一种很神奇的排序,基数排序(Radix Sort),时间复杂度为O(n),今天花1分钟,通过几幅图,争取让大家搞懂细节。
画外音:居然还有时间复杂度为O(n)的排序算法?不但有,其实还有很多。假设待排序的数组arr={72, 11, 82, 32, 44, 13, 17, 95, 54, 28, 79, 56}(1)基:被排序的元素的“个位”“十位”“百位”,暂且叫“基”,栗子中“基”的个数是2(个位和十位);(2)桶:“基”的每一位,都有一个取值范围,栗子中“基”的取值范围是0-9共10种,所以需要10个桶(bucket),来存放被排序的元素;FOR (每一个基) {
//循环内,以某一个“基”为依据
第一步:遍历数据集arr,将元素放入对应的桶bucket
第二步:遍历桶bucket,将元素放回数据集arr
}
更具体的,对应到上面的栗子,“基”有个位和十位,所以,FOR循环会执行两次。第一步:遍历数据集arr,将元素放入对应的桶bucket;操作完成之后,各个桶会变成上面这个样子,即:个位数相同的元素,会在同一个桶里。第二步:遍历桶bucket,将元素放回数据集arr;操作完成之后,数据集会变成上面这个样子,即:整体按照个位数排序了。第一步:依然遍历数据集arr,将元素放入对应的桶bucket;操作完成之后,各个桶会变成上面这个样子,即:十位数相同的元素,会在同一个桶里。第二步:依然遍历桶bucket,将元素放回数据集arr;操作完成之后,数据集会变成上面这个样子,即:整体按照十位数也排序了。首次按照个位从小到大,第二次按照十位从小到大,即:排序结束。(1)基的选取,可以先从个位开始,也可以先从十位开始,结果是一样的;