1、递归排序法 (性能消耗低):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
let arr = [1,4,2,6,7,9,11,5,8,10,3];
function mergeSort(arr){
let len = arr.length;
if(len < 2){
return arr;
}
let mid = Math.floor(len/2);
let left = arr.slice(0,mid);
let right = arr.slice(mid);
return merge(mergeSort(left),mergeSort(right));
}
function merge(left,right){
let result = [];
while(left.length >0 && right.length >0){
if(left[0] <= right[0]){
result.push(left.shift());
}else{
result.push(right.shift());
}
}
while(left.length){
result.push(left.shift());
}
while(right.length){
result.push(right.shift());
}
return result;
}
let newArr = mergeSort(arr);
console.log(newArr);
</script>
</body>
</html>
2、快速排序法:
let arr = [1,4,2,6,7,9,11,5,8,10,3];
function quickSort(arr){
let len = arr.length;
quick(arr,0,len-1);
}
function quick(arr,left,right){
let point = left;
let index = point + 1;
let len = arr.length;
for(let i=index; i<=right; i++){
if(arr[i] < arr[point]){
swap(arr,i,index);
index++;
}
}
swap(arr,point,index-1);
index--;
let leftE = index-1;
let rightB = index+1;
if(leftE > left){
quick(arr,point,leftE);
}
if(rightB < right){
quick(arr,rightB,right);
}
}
function swap(arr,i,j){
let tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
quickSort(arr)
console.log(arr)
3、堆排序法:
let arr = [1,4,2,6,7,9,11,5,8,10,3];
function heapSort(arr){
let len = arr.length;
for(let j=Math.floor(len/2)-1; j>=0; j--){
heap(arr,j,len);
}
for(let i =len-1; i>0; i--){
swap(arr,0,i);
len --;
heap(arr,0,len);
}
}
function heap(arr,i,len){
let left = 2*i+1,
right = 2*i+2;
max = arr[i],
maxIndex = i;
if(left<len && arr[left]>max){
maxIndex = left;
}
if(right<len && arr[right]>max){
maxIndex = right;
}
if(maxIndex !== i){
swap(arr,i,maxIndex);
heap(arr,maxIndex,len);
}
}
function swap(arr,i,j){
let tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
heapSort(arr)
console.log(arr)
4、基数排序法: (低消耗)
function redixSort(arr){
let len = arr.length;
let maxNum = arr[0];
let redixArr = [];
for(let i=1; i<len; i++){
if(arr[i] > maxNum){
maxNum = arr[i];
}
}
let x=10,y=1;
let maxDigit = maxNum.toString().length;
for(let i=0; i<maxDigit; i++){
for(let j=0; j<len; j++){
let v = Math.floor(arr[j] % x/y);
if(!redixArr[v])redixArr[v] = [];
redixArr[v].push(arr[j]);
}
x *=10;
y *=10;
let index =0;
for(let j=0,len=redixArr.length;j<len; j++){
let item = redixArr[j];
if(!item)continue;
item.forEach(v=>{
arr[index ++] = v;
});
}
redixArr = [];
}
}
arr = [233,434,565,23,78,2,54,56,9];
redixSort(arr);
console.log(arr);