1、插入排序
将记录按其关键字得大小插入到一个有序的记录序列中,插入后仍有序;
(1)直接插入排序
从待排序的n个记录中的第二个记录开始,依次与前面的记录比较并寻找插入的位置,每次外循环结束后,将当前的数插入到合适的位置。特点:①n值较小的时候效率高;②n较大时,若待排的记录按关键字基本有序时效率仍然较高。
稳定性:稳定排序。
最好情况:当待排序记录已经有序。
最坏情况:如果待排序记录为逆序。
时间复杂度为:O(n2)
function D_insert(record,n){
//对n个记录序列R[1]~R[n]进行直接插入排序
var i,j,temp;
for(i=1;i<n;i++){
j=i-1;
temp=record[i];
while(j<i&&record[j]>temp){
record[j+1]=record[j];
j--;
}
record[j+1]=temp;
}
return record;
}
(2)折半插入排序
折半插入排序算法是对直接插入排序算法的简单改进,主要将折半比较的思想引入插入排序,在一定程度上提高了直接插入排序的效率。
采用折半插入排序方法可以减少关键字的比较次数,而记录的移动次数与直接插入排序相同,故时间复杂的度为O(n2);
稳定的排序方法
function B_insert(record,n){
var i,j,low,high,mid,temp;
for(i=1;i<n;i++){
temp=record[i];
low=0;
high=i-1;
while(low<=high){
mid=Math.ceil((low+high)/2);
if(temp<record[mid]){
high=mid-1;
}else{
low=mid+1;
}
}
for(j=i-1;j>high;j--){
record[j+1]=record[j];
}
record[high+1]=temp;
}
console.log(record);
return record;
}
(3)希尔排序---缩小增量排序
Shell排序法是对相邻指定距离(称为增量)的元素进行比较,并不断把增量缩小至1,完成排序。
希尔排序的基本思想是将需要排序的序列划分成为若干个较小的子序列,对子序列进行插入排序,通过则插入排序能够使得原来序列成为基本有序。这样通过对较小的序列进行插入排序,然后对基本有序的数列进行插入排序,能够提高插入排序算法的效率。
特点:每一趟以不同的增量进行排序;
不稳定排序;
//希尔排序
function ShellSort(record){
var gap=Math.floor(record.length/2);
while(gap>=1){
for(var i=gap;i<record.length;i++){
var j,temp=record[i];
for(j=i-gap;j>=0&&record[j]>temp;j=j-gap){
record[j+gap]=record[j];
}
record[j+gap]=temp;// 经历了上层的for循环,j=j-gap;所以为了将temp放到合适的位置,要还原j
}
gap=Math.floor(gap/2);
}
console.log(record);
return record;
}