排序算法(JS)

自己整理一下数据结构的排序算法,用js写了一下,测试正确。

//插入排序
var table=[32,26,87,72,26,17];
for(var i=0;i<table.length;i++){
	var temp=table[i];
	for(var j=i-1;j>=0&&temp<table[j];j--){  //前面较大的元素向后移动
		table[j+1]=table[j];
	}
	table[j+1]=temp;   //temp值到达插入位置
	alert("第"+i+"趟:"+table);

}
//希尔排序
var table=[27,38,65,97,76,13,27,49,55,4];
var num=0;
for(var d=table.length/2;d>0;){
	
	for(var i=d;i<table.length;i++){
		var temp=table[i];
		for(var j=i-d;j>=0&&temp<table[j];j-=d){
			table[j+d]=table[j];
		}
		table[j+d]=temp;  //插入元素
	}
	d=parseInt(d/2); 
	num++;
	alert(num);
	alert("第"+num+"趟:"+table);
}

冒泡排序

        比较相邻两个元素的关键字,如果反序,则交换。若按升序,每一趟将被扫描的数据序列中的最大元素交换到最后位置,就像气泡从水里冒出来一样。

//冒泡排序
var table=[32,26,87,72,26,17];
var exchange=true;
for(var i=0;i<table.length&&exchange;i++){  //有交换时才进行下一步,最多n-1趟
	exchange=false;

	for(var j=0;j<table.length;j++){
		var temp=table[j];
		if(table[j]>table[j+1]){
			table[j]=table[j+1];
			table[j+1]=temp;
			exchange=false;   //有交换
		}
	}
	alert(i+table);
}

快速排序

      快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

<pre name="code" class="javascript">//快速排序
var table=[38,26,97,19,66,1,5,49];
var num=0;  //记录次数
quickSort(table,0,table.length-1);

function quickSort(table,begin,end){	
	if(begin<end){
		var i=begin;
		var j=end;
		var vot=table[i]; //第一个值为基准值		

		while(i!=j){  //一趟排序
			while(i<j&&vot<=table[j])  //从后向前寻找较小值
				j--;
			if(i<j)
				table[i++]=table[j];  //较小数值向前移动

			while(i<j&&table[i]<=vot) //从前往后寻找较大值
				i++;
			if(i<j)
				table[j--]=table[i];   //较大值向后移动
		}
		table[i]=vot;
		num++;
		alert("第"+num+"趟:"+table);
		quickSort(table,begin,j-1);
		quickSort(table,i+1,end);

	}
}

//直接选择排序   不稳定
var table=[38,97,26,19,38,5];
for(var i=0;i<table.length-1;i++){
	var min=i;      //设第i个数据最小

	for(var j=i+1;j<table.length;j++){  
		if(table[j]<table[min]){
			min=j;     //记住最小元素小标
		}
	}

	if(min!=i){       //将本趟最小元素换到最前面
		var temp=table[i];
		table[i]=table[min];
		table[min]=temp;
	}
	
	alert("第"+i+"趟:"+table);
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值