前言:本文主要是用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 &#61; arr.length;if (len <&#61; 1) {return arr;}// 1~n-1趟排序arr.map(function(item,index){if(index>0){for (var j &#61; index; j > 0 && arr[j - 1] > item; j--) {arr[j] &#61; arr[j - 1];}arr[j] &#61; item;}});console.timeEnd("插入排序")return arr
}
var arr &#61; [12, 290, 219, 278, 4432, 21, 43, 89, 78];
console.log(insertSort(arr));
希尔排序
shell排序也称为递减增量排序&#xff0c;效果比插入排序更好&#xff0c;对于不同的增量&#xff0c;排序性能也不同
下面我们看看 步长选择为
算法实现过程如下&#xff1a;这里我们选择 步长为4&#xff1a;&#xff08;每一列相当于一次插入排序&#xff09;
12 190 219 278
4432 21 43 89
78
// 第一次排序之后得到&#xff1a;
12 21 43 89
78 190 219 278
4432// 连接起来得到的是 [12&#xff0c;21&#xff0c;43&#xff0c;89&#xff0c;78&#xff0c;190&#xff0c;219&#xff0c;278&#xff0c;4432]&#xff0c;接着以2为步长 排序之后变为:
12 21
43 89
78 190
219 278
4432// 然后就是简单的插入排序
平均时间复杂度为&#xff1a;
快速排序实现2&#xff1a; &#xff08;以中间的为基准值&#xff09;
1 function qSort(arr) {
2 if (arr.length <&#61; 1) {
3 return arr;
4 }
5 var num &#61; Math.floor(arr.length / 2);
6
7 var numValue &#61; arr.splice(num, 1)[0];
8 var left &#61; [],
9 right &#61; [];
10 for (var i &#61; 0; i
11 if (arr[i] < numValue) {
12 left.push(arr[i]);
13 } else {
14 right.push(arr[i]);
15 }
16 }
17 return qSort(left)
18 .concat([numValue], qSort(right))
19 }
20
21 console.log(qSort([32, 45, 37, 16, 2, 87]))
快速排序的平均时间复杂度为O(NLogN)
合并排序
合并排序采用分治法的思想对数组进行分治&#xff0c;对半分开&#xff0c;分别对左右两边进行排序&#xff0c;然后将排序后的结果进行合并。按照这样的思想&#xff0c;递归做是最方便的。
1 int a[N], c[N];
2 void mergeSort(l, r) {
3 int mid, i, j, tmp;
4 if (r - 1 > l) {
5 mid &#61; (l &#43; r) >> 1;
6 // 分别最左右两天排序
7 mergeSort(l, mid);
8 mergeSort(mid, r);
9 // 合并排序后的数组
10 tmp &#61; l;
11 for (i &#61; l, j &#61; mid; i
12 if (a[i] > a[j]) c[tmp&#43;&#43;] &#61; a[j&#43;&#43;];
13 else c[tmp&#43;&#43;] &#61; a[i&#43;&#43;];
14 }
15 // 把剩余的接上
16 if (j < r) {
17 for (; j
18 } else {
19 for (; i
20 }
21 // 将c数组覆盖到a里
22 for (i &#61; l; i
23 a[i] &#61; c[i];
24 }
25 }
26 }
结束语
更新几种排序算法的实现