八大排序算法-复杂算法(希尔排序、快速排序、归并排序)
希尔排序-插入排序的扩展
function shellSort(arr) {
var len = arr.length;
for (var fraction = Math.floor(len / 2); fraction > 0; fraction = Math.floor(fraction / 2)) {
for (var i = fraction; i < len; i++) {
for (var j = i - fraction; j >= 0 && arr[j] > arr[fraction + j]; j -= fraction) {
var temp = arr[j];
arr[j] = arr[fraction + j];
arr[fraction + j] = temp;
}
}
}
return arr;
}
var arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 04];
console.log(shellSort(arr));
function swap(array, i, j){//两个数调换
var temp =array[j];
array[j]=array[i];
array[i]=temp;
};
function shellSort(arr) {
var len = arr.length;
for (var fraction = Math.floor(len / 2); fraction > 0; fraction = Math.floor(fraction / 2)) {
for (var i = fraction; i < len; i++) {
for (var j = i - fraction; j >= 0 && arr[j] > arr[fraction + j]; j -= fraction) {
swap(arr,j,fraction + j);
}
}
}
return arr;
}
var arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 04];
console.log(shellSort(arr));
//VM1784:19 (10) [4, 13, 27, 38, 49, 49, 55, 65, 76, 97]
快速排序-冒泡排序的扩展
算法思想:递归:
1.选取主元(通常以数组的第一个值为标记
2.将数组分为两个集合
3.合并左右俩个集合并返回
4.重复1、2、3、直到最后数组的长度小于2返回数组—递归结束条件
应用:大规模数据处理,对于小规模数据(n<100)选择使用简单排序
function quickSort(arr) {
var len = arr.length,
arrLeft = [],
arrRight = [],
tag;
if (len < 2) return arr;//递归结束条件
tag = arr[0];//主元
for (var i = 1; i < len; i++) {
if (arr[i] < tag) {
arrLeft.push(arr[i]);
} else {
arrRight.push(arr[i]);
};
}
return quickSort(arrLeft).concat(tag, quickSort(arrRight));
}
var arr1 = [3, 5, 2, 2,4, 8, 6];
console.log(quickSort(arr1)); //[ 2, 3, 4, 5, 6, 8 ]