插入排序操作,要求实现以下三种插入排序方法:
- 直接插入排序
- 折半插入排序
- 希尔排序
//插入类排序 #include<iostream> #include<stdlib.h> using namespace std; void InsertSort(int r[],int length) /* 对记录数组r做直接插入排序,length为数组中待排序记录的数目*/ { int i,j; for (i=2;i<=length;i++) { r[0]=r[i]; /*将待插入记录存放到监视哨r[0]中*/ j=i-1; while(r[0]<r[j]) /* 寻找插入位置 */ { r[j+1]=r[j]; j=j-1; } r[j+1]=r[0]; /*将待插入记录插入到已排序的序列中*/ } } void BinsertSort(int r[],int length) /*对记录数组r进行折半插入排序,length为数组的长度*/ { int i,j; int x; int low,high,mid; for (i=2;i<=length;++i) { x=r[i]; low=1; high=i-1; while(low<=high) /* 确定插入位置*/ { mid=(low+high)/2; if (x<r[mid]) high=mid-1; else low=mid+1; } for(j=i-1;j>=low;--j ) r[j+1]=r[j]; /* 记录依次向后移动 */ r[low]=x; /* 插入记录 */ } } void ShellInsert(int r[],int length,int delta) /*对记录数组r做一趟希尔插入排序,length为数组的长度,delta 为增量*/ { int i,j; for(i=1+delta;i<=length;i++) /* 1+delta为第一个子序列的第二个元素的下标 */ if(r[i]<r[i-delta]) { r[0]=r[i]; /* 备份r[i] (不做监视哨) */ for(j=i-delta;j>0&&r[0]<r[j];j-=delta) r[j+delta]= r[j]; r[j+delta]= r[0]; } } void ShellSort(int r[],int length,int delt[],int n) /*对记录数组r做希尔排序,length为数组r的长度,delta 为增量数组,n为delta[]的长度 */ { int i; for(i=0;i<=n-1;++i) ShellInsert(r,length,delt[i]); } int main(){ printf("----- 插入排序 -----\n"); printf("直接插入排序前:"); // 随机生成10个整数 int i,len=11; int A[10]; int delt[5]; for(i=1; i<len; i++) A[i] = rand()%100+1; for(i=1; i<len; i++) printf("%d ",A[i]); printf("\n"); InsertSort(A, len-1); printf("直接插入排序后:"); for(int i=1; i<len;i++) printf("%d ",A[i]); printf("\n \n"); printf("折半插入排序前:"); for(i=1; i<len; i++) A[i] = rand()%100+1; for(i=1; i<len; i++) printf("%d ",A[i]); printf("\n"); BinsertSort(A, len-1); printf("折半插入排序后:"); for(int i=1; i<len;i++) printf("%d ",A[i]); printf("\n \n"); printf("希尔插入排序前:"); for(int i=1; i<len; i++) A[i] = rand()%100+1; for(int i=1; i<len; i++) printf("%d ",A[i]); printf("\n"); ShellSort(A, len-1,delt,5); printf("希尔插入排序后:"); for(int i=1; i<len;i++) printf("%d ",A[i]); printf("\n \n"); }