十大经典排序算法(动图演示)( 四 )
< len 17}1819if(right < len 21}2223if(largest != i) {24swap(arr, i, largest);25heapify(arr, largest);26}27 }2829 function swap(arr, i, j) {30vartemp = arr[i];31arr[i] = arr[j];32arr[j] = temp;33 }3435 function heapSort(arr) {36buildMaxHeap(arr);3738for(vari = arr.length - 1; i > 0; i--) {39swap(arr, 0, i);40len--;41heapify(arr, 0);42}43returnarr;44 }8.4 算法分析计数排序是一个稳定的排序算法 。 当输入的元素是 n 个 0到 k 之间的整数时 , 时间复杂度是O(n+k) , 空间复杂度也是O(n+k) , 其排序速度快于任何比较排序算法 。 当k不是很大并且序列比较集中时 , 计数排序是一个很有效的排序算法 。 9、桶排序(Bucket Sort)桶排序是计数排序的升级版 。 它利用了函数的映射关系 , 高效与否的关键就在于这个映射函数的确定 。 桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布 , 将数据分到有限数量的桶里 , 每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排) 。 9.1 算法描述
- 设置一个定量的数组当作空桶;
- 遍历输入数据 , 并且把数据一个一个放到对应的桶里去;
- 对每个不是空的桶进行排序;
- 从不是空的桶里把排好序的数据拼接起来 。
1 function countingSort(arr, maxValue) { 2varbucket = newArray(maxValue + 1), 3sortedIndex = 0; 4arrLen = arr.length, 5bucketLen = maxValue + 1; 67for(vari = 0; i < arrLen; i++) { 8if(!bucket[arr[i]]) { 9bucket[arr[i]] = 0;10}11bucket[arr[i]]++;12}1314for(varj = 0; j < bucketLen; j++) {15while(bucket[j] > 0) {16arr[sortedIndex++] = j;17bucket[j]--;18}19}2021returnarr;22 }
9.4 算法分析桶排序最好情况下使用线性时间O(n) , 桶排序的时间复杂度 , 取决与对各个桶之间数据进行排序的时间复杂度 , 因为其它部分的时间复杂度都为O(n) 。 很显然 , 桶划分的越小 , 各个桶之间的数据越少 , 排序所用的时间也会越少 。 但相应的空间消耗就会增大 。10、基数排序(Radix Sort)基数排序是按照低位先排序 , 然后收集;再按照高位排序 , 然后再收集;依次类推 , 直到最高位 。 有时候有些属性是有优先级顺序的 , 先按低优先级排序 , 再按高优先级排序 。 最后的次序就是高优先级高的在前 , 高优先级相同的低优先级高的在前 。 10.1 算法描述- 取得数组中的最大数 , 并取得位数;
- arr为原始数组 , 从最低位开始取每个位组成radix数组;
- 对radix进行计数排序(利用计数排序适用于小范围数的特点);
1 function bucketSort(arr, bucketSize) { 2if(arr.length === 0) { 3returnarr; 4} 56vari; 7varminValue = http://kandian.youth.cn/index/arr[0]; 8varmaxValue = arr[0]; 9for(i = 1; i < arr.length; i++) {10if(arr[i] < minValue) {11minValue = arr[i];// 输入数据的最小值12} elseif(arr[i]> maxValue) {13maxValue = http://kandian.youth.cn/index/arr[i];// 输入数据的最大值14}15}1617// 桶的初始化18varDEFAULT_BUCKET_SIZE = 5;// 设置桶的默认数量为519bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;20varbucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;21varbuckets = newArray(bucketCount);22for(i = 0; i < buckets.length; i++) {23buckets[i] = [];24}2526// 利用映射函数将数据分配到各个桶中27for(i = 0; i < arr.length; i++) {28buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);29}3031arr.length = 0;32for(i = 0; i
- 重温儿时经典动画大戏,充满趣味的苹果X手机壳推荐
- AR应用可让虚拟人物在用户家中表演一首欢快版贝多芬经典作品
- 全球十大芯片巨头诞生!唯独华为海思芯片落榜:消失在Top15
- 回忆杀!夏普索爱摩托罗拉,这几个经典手机品牌你用过哪一个
- 深度学习入门之第五章:经典卷积神经网络
- 从3199元跌至2198元,去年的经典拍照旗舰迎来冰点价
- FIND5,曾经的经典记忆
- EXIF Sync for mac(EXIF信息排序软件)
- 德州点创教育:经典FOR循环打印星号三角形算法详解
- 程序员面试金典03.05_go_栈排序