各大排序算法性能比较及演示实例

  1. //归并排序 
  2. Array.prototype.mergeSort = function(s, e, b) { 
  3.     if (s == null
  4.         s = 0
  5.     if (e == null
  6.         e = this.length - 1
  7.     if (b == null
  8.         b = new Array(this.length); 
  9.     if (s >= e) 
  10.         return
  11.     var m = (s + e) >> 1
  12.     this.mergeSort(s, m, b); 
  13.     this.mergeSort(m + 1, e, b); 
  14.     for (var i = s, j = s, k = m + 1; i <= e; ++i)   
  15.         b[i] = this[(k > e || j <= m && this[j] < this[k]) ? j++ : k++]; 
  16.     for (var i = s; i <= e; ++i) 
  17.         this[i] = b[i]; 

算法性能:可以选取“归并操作”作为基本操作,“归并操作”即为将待归并表中元素复制到一个存储归并结果的表中的过程,其次数为要归并的两个子序列中元素个数之和。算法总共需要进行logn趟排序,每趟排序执行n次基本操作,因此整个归并排序中总的基本操作执行次数为nlogn,即时间复杂度为O(nlogn),说明归并排序时间复杂度和初始序列无关。由于归并排序需要转存整个待排序列,因此空间复杂度为O(n)。

一些结论

(1)快速排序、希尔排序、归并排序、堆排序的平均时间为O(nlogn),其他的为O(n*n)。

(2)快速排序、希尔排序、选择排序、堆排序不稳定,其他的稳定。

(3)经过一趟排序能够保证一个元素到达最终位置的是冒泡排序、快速排序、选择排序、堆排序。

(4)元素比较次数和原始序列无关的是选择排序、折半插入排序。

(5)排序趟数和原始序列有关的是交换类排序。

(6)直接插入排序和折半插入排序的区别是寻找插入位置的方式不同,一个是按顺序查找方式,另一个是按折半查找方式。