varpreIndex,current;
for(vari=1;i<len;i++){
preIndex=i-1;
current=arr[i];
while(preIndex>=0&&arr[preIndex]>current){
arr[preIndex+1]=arr[preIndex];
preIndex--;
}
arr[preIndex+1]=current;
}
returnarr;
}
希尔排序
希尔排序是插入排序的一种更高效率的实现 。它与插入排序的不同之处在于,它会优先比较距离较远的元素 。希尔排序的核心在于间隔序列的设定 。既可以提前设定好间隔序列,也可以动态的定义间隔序列 。动态定义间隔序列的算法是《算法(第4版》的合著者Robert Sedgewick提出的 。在这里,我就使用了这种方法 。
JavaScript代码实现

文章插图
归并排序
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
- 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法)
- 自下而上的迭代
However, it is not possible to do so in JavaScript, as the recursion goes too deep for the language to handle.说实话,我不太理解这句话 。意思是JavaScript编译器内存太小,递归太深容易造成内存溢出吗?还望有大神能够指教 。
然而,在 JavaScript 中这种方式不太可行,因为这个算法的递归深度对它来讲太深了 。
和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度 。代价是需要额外的内存空间 。
归并排序动图演示

文章插图
归并排序JavaScript代码实现:

文章插图
快速排序
快速排序又是一种分而治之思想在排序算法上的典型应用 。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法 。
快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高! 它是处理大数据最快的排序算法之一了 。虽然Worst Case的时间复杂度达到了O(n²),但是人家就是优秀,在大多数情况下都比平均时间复杂度为O(n log n) 的排序算法表现要更好,可是这是为什么呢,我也不知道 。。。好在我的强迫症又犯了,查了N多资料终于在《算法艺术与信息学竞赛》上找到了满意的答案:
快速排序的最坏运行情况是O(n²),比如说顺序数列的快排 。但它的平摊期望时间是O(n log n) ,且O(n log n)记号中隐含的常数因子很小,比复杂度稳定等于O(n log n)的归并排序要小很多 。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序 。快速排序动图演示

文章插图
快速排序JavaScript代码实现:

文章插图
【JavaScript中常见排序算法详解】堆排序
堆排序可以说是一种利用堆的概念来排序的选择排序 。分为两种方法:
- 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列
- 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列

文章插图
堆排序JavaScript代码实现:

文章插图
计数排序
计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中 。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数 。
计数排序动图演示

文章插图
计数排序JavaScript代码实现:
桶排序
桶排序是计数排序的升级版 。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定 。
为了使桶排序更加高效,我们需要做到这两点:
