#include<stdio.h>
#include<stdlib.h>
void InsertSort1(int A[],int n){//直接插入排序
/*注:A是函数参数,到了本函数中,A只是一个指针
(地址,系统在本函数运行时,是不知道a所表示的地址有多大的数据存储空间,这里只是告诉函数:一个数据存储空间首地址)
所以,sizoef(A)的结果是指针变量A占内存的大小,并非 A的长度 */
if(n==1){
printf("排序结果为%d",A[0]);
}
int temp,i,j;
for(i=1;i<n;i++){
if(A[i]<A[i-1]){
temp=A[i];
for(j=i-1;j>=0 && temp<A[j];j--){
A[j+1]=A[j];
}
A[j+1]=temp;
}
printf("第%d趟直接插入排序结果:",i);
for(int i=0;i<n;i++){
printf("%d ",A[i]);
}
printf("\n");
}
printf("\n");
}
void InsertSort2(int A[],int n){//折半插入排序
int i,j,low,high,mid,temp;
for(i=1;i<n;i++){
if(A[i]<A[i-1]){
low=0;high=i-1;
while(low<=high){ //low=hith+1时停止
mid=(low+high)/2;
if(A[mid]>A[i]){
high=mid-1;
}
else{
low=mid+1;
}
}
temp=A[i];
for(j=i-1;j>=low;j--){
A[j+1]=A[j];
}
A[j+1]=temp;
}
printf("第%d趟折半插入排序结果:",i);
for(int i=0;i<n;i++){
printf("%d ",A[i]);
}
printf("\n");
}
printf("\n");
}
void ShellSort(int A[],int n){//希尔排序
int d,i,j,temp;
int time=0;
for(d=n/2;d>=1;d/=2){
time+=1;
for(i=d;i<n;i++){
if(A[i]<A[i-d]){
temp=A[i];
for(j=i-d;j>=0&&A[j]>temp;j-=d){
A[j+d]=A[j];
}
A[j+d]=temp;
}
}
printf("第%d趟希尔排序结果:",time);
for(int i=0;i<n;i++){
printf("%d ",A[i]);
}
printf("\n");
}
printf("\n");
}
int main(){
int A[]={99,1,54,6,1,35,7,8,32};
int B[]={99,1,54,6,1,35,7,8,32};
int C[]={99,1,54,6,1,35,7,8,32};
InsertSort1(A,9);
InsertSort2(B,9);
ShellSort(C,9);
return 0;
}
程序运行效果: