前言:本文主要是用JavaScript
实现数据结构中的各种排序算法,例如:插入排序
、希尔排序、合并排序等。
冒泡排序
function bubbleSort(arr) { console.time("冒泡排序")var num = 0; for (var i = arr.length; i > num; num++) { for (var j = i - 1; j > num; j--) { if(arr[j-1]>arr[j]){ var temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp; } } } console.timeEnd("冒泡排序") return arr } var arr = [12, 290, 219, 278, 4432,21, 43, 89, 78]; console.log( bubbleSort(arr));
时间复杂度: 最差 O(n2) ; 最优 O(n)
插入排序
插入排序的基本原理如下图:从前向后构建有序序列,对于未排序序列,在已排序的序列中从后向前扫描插入位置,对于第p个元素,需要扫描p-1次,平均来说插入排序算法复杂度为O(n2)
function insertSort(arr) { console.time("插入排序") var len = arr.length; if (len <= 1) { return arr; } // 1~n-1趟排序 arr.map(function(item,index){ if(index>0){ for (var j = index; j > 0 && arr[j - 1] > item; j--) { arr[j] = arr[j - 1]; } arr[j] = item; } }); console.timeEnd("插入排序") return arr } var arr = [12, 290, 219, 278, 4432, 21, 43, 89, 78]; console.log(insertSort(arr));
希尔排序
shell排序也称为递减增量排序,效果比插入排序更好,对于不同的增量,排序性能也不同
下面我们看看 步长选择为并且对步长取半直到步长达到1的算法实现。
function shellSort(arr) { console.time("希尔排序") var gap, i, j; var temp; for (gap = arr.length >> 1; gap > 0; gap >>= 1) for (i = gap; i < arr.length; i++) { temp = arr[i]; for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap) arr[j + gap] = arr[j]; arr[j + gap] = temp; } console.timeEnd("希尔排序") return arr } var arr = [12, 290, 219, 278, 4432, 21, 43, 89, 78]; console.log(shellSort(arr));
算法实现过程如下:这里我们选择 步长为4:(每一列相当于一次插入排序)
12 190 219 278 4432 21 43 89 78 // 第一次排序之后得到: 12 21 43 89 78 190 219 278 4432 // 连接起来得到的是 [12,21,43,89,78,190,219,278,4432],接着以2为步长 排序之后变为: 12 21 43 89 78 190 219 278 4432 // 然后就是简单的插入排序
平均时间复杂度为:
快速排序
快速排序的关键在于选取中心枢纽povit,该值可以随机选择,但是不同的选择会有所影响,在这里我直接选择了最左端的元素
function quickSort(arr) { return qSort(0,arr.length-1,arr); } function qSort(low, high, x) { //快速排序 if (low < high) { var povit = partition(low, high, x); if (low < povit) qSort(low, povit - 1, x); if (povit < high) qSort(povit + 1, high, x) } return x } function partition(low, high, x) { if (low == high) return; var povit = low; var temp = x[povit]; while (low < high) { while (low < high && x[high] < temp) { high--; } if (low != high) { x[povit] = x[high]; povit = high; x[povit] = temp; low++; } while (low < high && x[low] > temp) { low++; } if (low != high) { x[povit] = x[low]; povit = low; x[povit] = temp; high--; } } return povit; } var arr = [12, 290, 219, 278, 4432, 21, 43, 89, 78]; console.time("快速排序"); console.log(quickSort(arr)); console.timeEnd("快速排序");
结束语
今天暂时先总结这四种排序算法,有时间再把其他的补上
原文:http://www.cnblogs.com/kasmine/p/6416472.html