javascript 十大经典排序
首先生成一个数字数组:
let arr = Array.from({length:20},x=>{return Math.ceil(Math.random()*10**2)}) console.log(arr) function fn(a,b){ return a-b; } // console.log(arr.sort(fn))
function bubbleSort(a){ let k = 0; let h = 0; for(var i=0;i<a.length;i++){ for(var j=i+1;j<a.length;j++){ k++; if(a[i] > a[j]){ h++; [a[i],a[j]] = [a[j],a[i]]; } } } console.log('o=',k,'h=',h); return a; } console.log('bubbleSort', bubbleSort([].concat(arr)) ) function bubbleSort1(arr) { var len = arr.length; let k = 0; let h = 0; for (var i = 0; i < len; i++) { for (var j = 0; j < len - 1 - i; j++) { k++; if (arr[j] > arr[j+1]) { //相邻元素两两对比 h++; [arr[j+1],arr[j]] = [arr[j],arr[j+1]]; } } } console.log('o=',k,'h=',h); return arr; } console.log('bubbleSort1', bubbleSort1([].concat(arr)) )
function selectionSort(a){ let k = 0; let h = 0;a for(var i=0;i<a.length;i++){ let tmp = a[i]; let pos = i; for(var j=i+1;j<a.length;j++){ k++; if(tmp>a[j]){ tmp=a[j]; pos = j; h++; } } if(tmp<a[i]){ [a[i], a[pos]] = [a[pos],a[i]]; } } console.log('o=',k,'h=',h); return a; } console.log('selectionSort', selectionSort([].concat(arr)) )
function insertionSort(arr){ let k=0; let h=0; for(var i=1;i<arr.length;i++){ let j = i; let cur = arr[i]; let flag = false; while(j>=0 && arr[j-1] > cur){ k++; h++; arr[j] = arr[j-1]; j--; flag=true; } if(!flag){ k++; } arr[j]=cur; } console.log('o=',k,'h=',h); return arr; } let insertArr = insertionSort([].concat(arr)); console.log('insertionSort', insertArr) console.log('insertionSort', insertionSort(insertArr)) console.log('insertionSort', insertionSort(insertArr.reverse())) function insertionSort1(arr){ let k=0; let h=0; for(var i=1;i<arr.length;i++){ let cur = arr[i]; let left = 0; let right = i-1; while(left <= right){ k++; let mid = parseInt((right+left)/2); if(arr[mid] > cur){ right = mid -1; }else{ left = mid + 1; } } for(var j=i-1;j>=left;j--){ h++; k++; arr[j+1]=arr[j]; } arr[left] = cur; } console.log('o=',k,'h=',h); return arr; } let insertArr1 = insertionSort1([].concat(arr)); console.log('insertionSort1', insertArr1) console.log('insertionSort1', insertionSort1(insertArr1)) console.log('insertionSort1', insertionSort1(insertArr1.reverse()))
function shellSort(a){ let len = a.length; let gap = 1; let k=0; let h=0 while(gap<(len/3)){ gap = gap*3+1; } for(gap;gap>0;gap=Math.floor(gap/3) ){ for(var i=gap;i<len;i++){ let cur = a[i]; for(var j=i-gap;j>=0 && cur < a[j];j-=gap){ k++; h++; a[j+gap] = a[j]; } a[j+gap] = cur; } } console.log('o=',k,'h=',h); return a; } let shellArr = shellSort([].concat(arr)); console.log('shellSort', shellArr) console.log('shellSort', shellSort(shellArr)) console.log('shellSort', shellSort(shellArr.reverse()))
function merge(a,b){ let len1 = a.length; let len2 = b.length; let i=0,j=0; let ret = []; while(i<len1 && j<len2){ if(a[i]<b[j]){ ret.push(a[i]); i++; }else{ ret.push(b[j]); j++; } } if(i<len1){ ret = ret.concat(a.slice(i)); } if(j<len2){ ret = ret.concat(b.slice(j)); } return ret; } function mergeSort(a){ let len = a.length; if(len == 1){ return a; } let mid=parseInt(len/2); let left = a.slice(0,mid); let right = a.slice(mid); return merge(mergeSort(left),mergeSort(right)); } let mergeArr = mergeSort([].concat(arr)); console.log('mergeSort', mergeArr) console.log('mergeSort', mergeSort(mergeArr)) console.log('mergeSort', mergeSort(mergeArr.reverse())) // 非递归 function mergeSort1(a){ let gap = 3; let k=0; for(gap;gap<a.length;gap=2*gap){ for(var i=0;i<a.length;i+=gap){ let r = []; k++; if((i+gap)>a.length){ r = merge(a.slice(i),[]); }else{ let mid = parseInt((i+i+gap)/2); let left = a.slice(i,mid); let right = a.slice(mid,i+gap); r = merge(left,right); } a.splice(i,r.length,...r); } if(gap*2>a.length){ a = merge(a.slice(0,gap),a.slice(gap, a.length)); } } console.log('k=',k) return a; } let mergeArr1 = mergeSort1([].concat(arr)); console.log('mergeSort1', mergeArr1) console.log('mergeSort1', mergeSort1(mergeArr1)) console.log('mergeSort1', mergeSort1(mergeArr1.reverse()))
function quickSort(a){ if(a.length <= 1) return a; let pivotIndex = Math.ceil(a.length/2); let pivot = a.splice(pivotIndex,1)[0]; let left=[]; let right=[]; let k=0; for(var i=0;i<a.length;i++){ k++; if(a[i]<pivot){ left.push(a[i]); }else{ right.push(a[i]); } } console.log('k=',k) return quickSort(left).concat([pivot],quickSort(right)); } let quickArr = quickSort([].concat(arr)); console.log('quickSort', quickArr) function partition(a,left,right){ let pivot=a[right]; let i=left; for(var j=left;j<=right;j++){ if(a[j]<pivot) { [a[i], a[j]]=[a[j],a[i]]; i++; } } [a[i],a[right]]=[a[right],a[i]]; return i; } function quickSort1(a, left, right){ if(left<right){ let i = partition(a,left,right); quickSort1(a,left,i-1); quickSort1(a, i+1, right); } return a; } let quickArr1 = quickSort1([].concat(arr), 0, arr.length-1); console.log('quickSort1', quickArr1);
function buildMaxHeap(a){ let len = a.length; for(var i=Math.floor(len/2);i>=0;i--){ heapify(a,i,len); } return a; } function heapify(a,i,len){ let left = 2*i+1; let right = 2*i+2; let largest = i; if(left<len && a[left] > a[largest]){ largest = left; } if(right<len && a[right] > a[largest]){ largest = right; } if(largest != i){ [a[largest],a[i]] = [a[i],a[largest]]; heapify(a,largest,len); } } function heapSort(a){ let len = a.length; buildMaxHeap(a); for(var i=(len-1);i>=0;i--){ [a[i],a[0]] = [a[0],a[i]]; heapify(a,0,--len); } return a; } let heapArr1 = heapSort([].concat(arr), 0, arr.length-1); console.log('heapSort', heapArr1);
function countingSort(a){ let max = 0; let len = a.length; let k=0; for(var i=0;i<len;i++){ if(max<a[i]){ max=a[i]; } k++; } let bucket = new Array(max+1); for(var i=0;i<len;i++){ if(!bucket[a[i]]){ bucket[a[i]] = 0; } bucket[a[i]]++; k++; } let h=0; // for(var j=1;j<max+1;j++){ // while(bucket[j]>0){ // a[h++] = j; // bucket[j]--; // } // k++; // } // bucket.forEach((val,index)=>{ // while(val>0){ // a[h++] = index; // val--; // } // k++; // }) bucket.map((val,index)=>{ while(val>0){ a[h++] = index; val--; } k++; }) console.log('k=',k,h) return a; } let countingArr1 = countingSort([].concat(arr), 0, arr.length-1); console.log('countingSort', countingArr1);
function bucketSort(a){ let max = 0; let min = 0; let len = a.length; let size = Math.ceil(len/3); let count = 0; for(var i=0;i<len;i++){ if(a[i]<min){ min = a[i]; } if(a[i]>max){ max = a[i]; } count++; } let bucketLen = Math.floor( (max-min)/size ); let bucket = new Array(bucketLen+1); for(var j=0;j<bucketLen+1;j++){ bucket[j] = []; count++; } for(var k=0;k<len;k++){ bucket[Math.floor((a[k]-min)/size)].push(a[k]); count++; } a.length = 0; for(var l=0;l<bucketLen+1;l++){ countingSort(bucket[l]); if(bucket[l].length>0){ a.push(...bucket[l]); } count++; } console.log('count=',count); return a; } let bucketArr1 = bucketSort([].concat(arr), 0, arr.length-1); console.log('bucketSort', bucketArr1);
function radixSort(a){ let bucket = new Array(11); let max = Math.max(...a); let len = max.toString().length; let arrLen = a.length; let count=0; let rest = []; for(var i=0;i<len;i++){ bucket.length = 0; for(var j=0;j<a.length;j++){ let str = a[j].toString(); if(str.length>i){ let index = str[str.length-1-i]; if(bucket[index] == null){ bucket[index] = []; } bucket[index].push(a[j]); count++; }else{ rest.push(a[j]); } } a.length = 0; bucket.forEach((val,index)=>{ a.push(...bucket[index]); count++; }) } if(a.length<arrLen){ a=[].concat(rest,a); } console.log('count = ',count); return a; } let radixtArr1 = radixSort([].concat(arr), 0, arr.length-1); console.log('radixSort', radixtArr1);
参考:
https://www.cnblogs.com/onepixel/p/7674659.html
https://www.cnblogs.com/jztan/p/5878630.html
https://www.cnblogs.com/vali/p/7803243.html