2-路插入排序
- 实现思想
- 2-路插入排序算法是在折半插入排序的基础上对其进行改进,减少其在排序过程中移动记录的次数从而提高效率。
- 具体实现思路为:另外设置一个同存储记录的数组大小相同的数组 d,将无序表中第一个记录添加进 d[0] 的位置上,然后从无序表中第二个记录开始,同 d[0] 作比较:如果该值比 d[0] 大,则添加到其右侧;反之添加到其左侧。在这里的数组 d 可以理解成一个环状数组。
- 时间复杂度
- 最好情况:O(n)
- 最坏情况:O(n²)
- 平均时间复杂度:O(n²)
- 空间复杂度
- 稳定性
代码
#include<stdio.h>
#define MaxSize 8
void InsertSort2(int r[],int n){
int i,j,first,final;
int d[MaxSize];
if(n>0){
d[0]=r[1];
first=final=0;
}
for(i=2;i<=n;i++){
if(r[i]<d[first]){
first=(first-1+MaxSize)%MaxSize;
d[first]=r[i];
}
else if(r[i]<d[final]){
j=final;
do{
d[(j+1)%MaxSize]=d[j];
j=(j-1+MaxSize)%MaxSize;
}while(r[i]<d[j]);
d[(j+1)%MaxSize]=r[i];
final=(final+1)%MaxSize;
}
else if(r[i]>d[final]){
final=(final+1)%MaxSize;
d[final]=r[i];
}
}
for(i=1,j=first;i<=n;i++,j=(j+1)%MaxSize)
r[i]=d[j];
}
void Output(int r[],int n){
int i;
for(i=1;i<=n;i++){
printf("%d ",r[i]);
}
printf("\n");
}
void main(){
int n=8;
int r[9]={0,3,1,7,5,2,4,9,6};
printf("未排序的集合为:\n");
Output(r,n);
InsertSort2(r,n);
printf("从小到大排序后的集合为:\n");
Output(r,n);
}