js编写排序算法

近来回顾了一下大二上的数据结构,书上的排序算法都是用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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值