1)算法简介归并排序是建立在归并操作上的一种有效的排序算法 。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用 。归并排序是一种稳定的排序方法 。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序 。若将两个有序表合并成一个有序表,称为2-路归并 。2)算法描述和实现具体算法描述如下:
- 把长度为n的输入序列分成两个长度为n/2的子序列;
- 对这两个子序列分别采用归并排序;
- 将两个排序好的子序列合并成一个最终的排序序列 。
- functionmergeSort(array,p,r){ if(p < r){ varq = Math.floor((p + r) / 2); mergeSort(array,p,q); mergeSort(array,q + 1,r); merge(array,p,q,r); }}functionmerge(array,p,q,r){ varn1 = q - p + 1,n2 = r - q,left = [],right = [],m = n = 0; for(vari = 0;i < n1;i++){ left[i] = array[p + i]; } for(varj = 0;j < n2;j++){ right[j] = array[q + 1 + j]; } left[n1] = right[n2] = Number.MAX_VALUE; for(vark = p;k <= r;k++){ if(left[m] <= right[n]){ array[k] = left[m]; m++; }else{ array[k] = right[n]; n++; } }}
- 3)算法分析
- 最佳情况:T(n) = O(n)
- 最差情况:T(n) = O(nlogn)
- 平均情况:T(n) = O(nlogn)
1)算法简介桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序) 。2)算法描述和实现具体算法描述如下:
- 设置一个定量的数组当作空桶;
- 遍历输入数据,并且把数据一个一个放到对应的桶里去;
- 对每个不是空的桶进行排序;
- 从不是空的桶里把排好序的数据拼接起来 。
- /*方法说明:桶排序@param array 数组@param num 桶的数量*/functionbucketSort(array,num){ if(array.length <= 1){ returnarray; } varlen = array.length,buckets = [],result = [],min = max = array[0],regex = '/^[1-9]+[0-9]*$/',space,n = 0; num = num || ((num > 1 && regex.test(num))?num : 10); for(vari = 1;i < len;i++){ min = min <= array[i]?min : array[i]; max = max >= array[i]?max : array[i]; } space = (max - min + 1) / num; for(varj = 0;j < len;j++){ varindex = Math.floor((array[j] - min) / space); if(buckets[index]){ // 非空桶,插入排序 vark = buckets[index].length - 1; while(k >= 0 && buckets[index][k] > array[j]){ buckets[index][k + 1] = buckets[index][k]; k--; } buckets[index][k + 1] = array[j]; }else{ //空桶,初始化 buckets[index] = []; buckets[index].push(array[j]); } } while(n < num){ result = result.concat(buckets[n]); n++; } returnresult;}
- 3)算法分析桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n) 。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少 。但相应的空间消耗就会增大 。
1)算法简介计数排序(Counting sort)是一种稳定的排序算法 。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数 。然后根据数组C来将A中的元素排到正确的位置 。它只能对整数进行排序 。2)算法描述和实现具体算法描述如下:
- 找出待排序的数组中最大和最小的元素;
- 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
- 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
- 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1 。
- functioncountingSort(array){ varlen = array.length,B = [],C = [],min = max = array[0]; for(vari = 0;i < len;i++){ min = min <= array[i]?min : array[i]; max = max >= array[i]?max : array[i]; C[array[i]] = C[array[i]]?C[array[i]] + 1 : 1; } for(varj = min;j < max;j++){ C[j + 1] = (C[j + 1] || 0) + (C[j] || 0); } for(vark = len - 1;k >=0;k--){ B[C[array[k]] - 1] = array[k]; C[array[k]]--; } returnB;}
- 3)算法分析当输入的元素是n 个0到k之间的整数时,它的运行时间是 O(n + k) 。计数排序不是比较排序,排序的速度快于任何比较排序算法 。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存 。
推荐阅读
- 辨识普洱茶叶年份的几种常用方法
- java五大常用算法,早看早知道
- 插入排序算法,就这么简单,还学不会算我输
- 简谈企业最常用的三种安卓app开发语言
- 浅谈派单算法:滴滴出行里车主是如何接到平台派单的?
- 八大常用茶叶贮存方法简介
- 你必需知道的10个 Nginx 常用命令
- mysql之my.cnf/my.ini常用配置整理
- diff算法介绍
- 茶叶产品4大常用有效贮存方法