近来回顾了一下大二上的数据结构,书上的排序算法都是用c写的,所有动手用js写了一遍,下面直接上代码。
//commonjs 一个交换变量的函数,下面会常用到
function commit(arr,left,right){
var temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
}
//冒泡排序
function maopaoSort(arr){
for(var len = arr.length,i = len;i>0;i--){
for(var j = 1;j<i;j++){
if(arr[j]<arr[j-1]){
commit(arr,j,j-1);
}
}
}
return arr;
}
//选择排序
function xuanzeSort(arr){
for(var i = 0,len = arr.length;i<len;i++){
var index = i;
for(var j = i;j<len;j++){
if(arr[j]<arr[index]){
index = j;
}
}
commit(arr,i,index);
}
return arr;
}
//插入排序
function charuSort(arr){
for(var i = 1,len = arr.length;i<len;i++){
var index = i-1;
var current = arr[i];
while(index>=0 && current<arr[index]){
arr[index+1] = arr[index];
index--;
}
arr[index+1] = current;
}
return arr;
}
//希尔排序
function xierSort(arr){
for(var aqe = 4;aqe>=1;aqe/=2){
for(var i = 0;i<aqe;i++){
for(var j = i+aqe,len = arr.length;j<len;j+=aqe){
var index = j-aqe;
var current = arr[j];
while(index>=i && current<arr[index]){
arr[index+aqe] = arr[index];
index-=aqe;
}
arr[index+aqe] = current;
}
}
}
return arr;
}
//快速排序
function kuaishuSort(arr,left,right){
var len = arr.length;
left = typeof left == 'number' ? left : 0;
right = typeof right == 'number' ? right : len-1;
if(right>left){
var fgline = fegeline(arr,left,right);
kuaishuSort(arr,left,fgline-1);
kuaishuSort(arr,fgline+1,right);
}
return arr;
}
function fegeline(arr,left,right){
var index = left+1;
for(var i = left+1;i<=right;i++){
if(arr[i]<arr[left]){
commit(arr,i,index)
index++;
}
}
commit(arr,left,index-1);
return index-1;
}
//归并排序
function guibingSort(arr){
var len = arr.length;
if(len<2){
return arr;
}
var mid = Math.floor(len/2);
var left = arr.slice(0,mid);
var right = arr.slice(mid);
return compare(guibingSort(left),guibingSort(right));
}
function compare(left,right){
var result = [];
while(left.length>0 && right.length>0){
if(left[0]>right[0]){
result.push(right.shift())
}else{
result.push(left.shift())
}
}
while(left.length){
result.push(left.shift())
}
while(right.length){
result.push(right.shift())
}
return result;
}
//堆排序
var len ;
function duiSort(arr){
len = arr.length;
buildDui(arr);
for(var i = len-1;i>0;i--){
commit(arr,0,i);
len--;
adjustDui(arr,0);
}
}
function buildDui(arr){
var num = Math.floor(len/2);
for(var i = num;i>=0;i--){
adjustDui(arr,i);
}
console.log('jieshu:'+arr)
}
function adjustDui(arr,index){
var Index = index;
var left = 2*index+1;
var right = 2*index+2;
if(left<len && arr[left]>arr[Index]){
Index = left;
}
if(right<len && arr[right]>arr[Index]){
Index = right;
}
if(Index != index){
commit(arr,index,Index)
adjustDui(arr,Index);
}
console.log(arr);
}
//计数排序
function jishuSort(arr,maxNum){
var newArr = new Array(maxNum);
for(var i = 0,len = arr.length;i<len;i++){
if(!newArr[arr[i]]){
newArr[arr[i]] = 0;
}
newArr[arr[i]]++;
}
arr = [];
for(var j = 0,len = newArr.length;j<len;j++){
while(newArr[j]>0){
arr.push(j);
newArr[j]--;
}
}
return arr;
}
//桶排序
function tongSort(arr,bucketSize){
bucketSize = bucketSize ? bucketSize : 5;
var min = arr[0];
var max = arr[0];
for(var i = 0,len = arr.length;i<len;i++){
if(arr[i]>max){
max = arr[i];
}
if(arr[i]<min){
min = arr[i];
}
}
var buickNum = Math.floor((max-min)/bucketSize)+1;
var buickArr = new Array(buickNum);
for(var m = 0,leng = buickArr.length;m<leng;m++){
buickArr[m] = [];
}
for(var i = 0,len = arr.length;i<len;i++){
buickArr[Math.floor((arr[i]-min)/bucketSize)].push(arr[i])
}
arr = [];
for(var val = 0,len = buickArr.length;val<len;val++){
maopaoSort(buickArr[val]);
arr.push.apply(arr,buickArr[val]);
}
return arr;
}
//基数排序(从最小位开始)
function baseSort(arr,maxDigit){
for(var i = 0,eq = 1,bq = 10;i<maxDigit;i++,eq*=10,bq*=10){
var buicks = [];
for(var i = 0,len = arr.length;i<len;i++){
var num = parseInt(arr[i]%bq/eq);
if(buicks[num] == null){
buicks[num] = [];
}
buicks[num].push(arr[i]);
}
arr = [];
for(var j = 0,len = buicks.length;j<len;j++){
if(buicks[j]){
arr.push.apply(arr,buicks[j])
}
}
}
return arr;
}