自己整理一下数据结构的排序算法,用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);
}