插入排序算法实现
void InsertSort(int a[],int n){
int i,j,t;
for(i=1;i<n;i++){
int t=a[i];
for(j=i-1;j>=0&&a[j]>t;j--){
a[j+1] = a[j];
}
a[j+1]=t;
}
}
- 直接插入排序(带哨兵版本) A[0]位置不存储元素,放置哨兵节点
void InsertSortwithguard(int a[],int n){
int i,j;
for(i=2;i<n;i++){
a[0]=a[i];
for(j=i-1;a[j]>a[0];j--){
a[j+1]=a[j];
}
a[j+1]=a[0];
}
}
- 折半插入排序:通过折半查找到插入元素的位置,让查找时间变短 (带哨兵)
void BinaryInsertionSort(int a[],int n){
int i,j,low,high,mid;
for(i=2;i<n;i++){
a[0]=a[i];
low=1; high=i-1;
while(low<high){
mid=low+high+1>>1;
if(a[mid]<=a[0]){
low = mid;
}else{
high = mid-1;
}
}
printf("%d\n",low);
for(j=i-1;j>high;j--) a[j+1]=a[j];
a[high+1] = a[0];
}
}
void ShellSort(int a[],int n){
int d,i,j;
for(d=n/2;d>=1;d=d/2){
for(i=d+1;i<n;i++){
a[0] = a[i];
for(j=i-d;j>0&&a[j]>a[0];j=j-d){
a[j+d]=a[j];
}
a[j+d]=a[0];
}
}
}