引言
突发奇想使用js来实现这两个经典的排序算法。由于JavaScript高度方便的数据结构,因此相比C版本的代码,此版本更加容易理解!
快速排序
/** 快速排序(函数思想)
* @param {Object} list 要排序的列表
* @return {Array} 已经排序的数组
*/
function quikSort(list){
if(! (list instanceof Array)){
throw (new Error("错误的列表"));
}
if(list.length == 0){
return [];
}
//对数据进行筛选
let firstElement = list.splice(0, 1);
let lessElements = list.filter(e => e <= firstElement[0]);
let greatElements = list.filter(e => e > firstElement[0]);
//递归调用
return quikSort(lessElements)
.concat(firstElement)
.concat(quikSort(greatElements));
}
归并排序
/** 归并排序
* @param {Object} list 要排序的列表
* @return {Array} 已经排序的数组
*/
function mergeSort(list){
if(!(list instanceof Array)){
throw (new Error("错误的列表"));
}
if(list.length <= 1){
return list;
}
//对数据进行分割
let splits = list.splice(Math.floor(list.length / 2), list.length);
//递归调用
let leftPart = mergeSort(list);
let rightPart = mergeSort(splits);
// 进行归并
let result = [];
while(leftPart.length != 0 && rightPart.length != 0){
if(leftPart[0] <= rightPart[0]){
result.push(leftPart.splice(0, 1)[0])
}else{
result.push(rightPart.splice(0, 1)[0])
}
}
return result.concat(leftPart).concat(rightPart);
}
测试结果
//result = quikSort([9, 8, 7, 6, 6, 5, 5, 4, 3, 3, 2, 1, 9])
//result = mergeSort([9, 8, 7, 6, 6, 5, 5, 4, 3, 3, 2, 1, 9])
//console.log(result)