插入排序:直接插入排序、折半插入排序、希尔排序;
插入排序的思想:每一步将一个待排序的记录,按其主关键字的大小插入到前面已经排序的文件中适当位置上,直至全部插完为止。
1、直接插入排序
它的基本操作是将一个记录插入到已排好的有序表中,从而得到一个新的、记录数增加1的有序表。
代码实现:
public static void directInsertSort(int[] num){
int mark=0,j=0;
for(int i=1;i
mark){
while(j>=0&&mark
时间复杂度:O(n2)
稳定性:稳定的;
2、折半插入排序
基本操作:通过待插入记录与有序表居中的记录按关键码比较,将有序表一分为二,下次比较在有序子表中进行,这样继续下去,直到要比较的子表中只有一个记录时,比较一次便确定了插入位置。
折半插入排序仅减少了关键字间的比较次数,而记录移动的次数不变。
时间复杂度仍为O(n2)
2-路插入排序(待补充)
public static void binaryInsertSort(int[] num){
int l,h,m=0;
int mark=0;
for(int i=1;i
num[i])
h=m-1;
else
l=m+1;
}
// 并非所有情况都需要进行移位操作
if(!(m==(i-1))){
//进行移位操作
if(num[m]>mark){
for(int j=i-1;j>=m;j--){
num[j+1]=num[j];
}
num[m]=mark;
}
else{
for(int j=i-1;j>m;j--){
num[j+1]=num[j];
}
num[m+1]=mark;
}
}
}
}
3、希尔排序
希尔排序又称“缩小增量法”
基本思想:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
排序过程:先取一个正整数d1<n,把全部记录分成d1个组,所有距离为d1倍数的记录放一组,在各组内进行插入排序;然后d2<d1,重复上述分组和排序工作;直至di=1,即所有记录放进一个组中排序为止。