#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
void Insertsort(int A[],int n)
{
int i,j;
for( i=2;i<n;i++){ //依次将失序序列插入前面有序序列
if(A[i]<A[i-1])
A[0]=A[i]; //A0是待插入的元素
for( j=i-1;A[j]>A[0];j--) //将有序序列依次后移
{
A[j+1]=A[j];
}
A[j+1]=A[0];//元素插入其位置
}
}
void HalfInsert(int A[],int n)
{
int i,j,low,high;
for(i=2;i<=n;i++){
A[0]=A[i];
low=1,high=i-1;
while(low<high){
int mid=(low+high)/2;//取中间点
if(A[0]<A[mid]) //确定在哪个区间找
high=mid-1;
else
low=mid+1;
}
for(int j=i-1;j>=high+1;j--)//将有序区间的元素后移
A[j+1]=A[j];
A[high+1]=A[0]; //插入操作
}
}
void ShellSort(int A[],int n)
{
for(int delt=n/2;delt>1;delt/=2) //步长变化
for(int i=delt+1;i<=n;i++)
if(A[i]<A[i-delt]){ //将要执行插入操作
A[0]=A[i];
int j;
for(j=i-delt;j>0&&A[0]<A[j];j-=delt)
A[j+delt]=A[j];//某趟的shell序列后移
A[j+delt]=A[0]; //插入操作
}
}
void num_rand(int A[],int N){
srand(time(0));
for(int i=0;i<N;i++)
A[i]=rand()%50;
}
void num_copy(int A[],int B[],int N)
{
for(int i=0;i<N;i++)
B[i]=A[i];
}
void matrix_out(int A[],int n,bool mark){
for(int j=0;j<n;j++)
cout<<A[j]<<" ";
cout<<endl;
}
int main()
{
const int num_count=15;
int A[num_count],B[num_count];
//生成序列
num_rand(A,num_count);
cout<<"插入排序:"<<endl;
num_copy(A,B,num_count);
matrix_out(B,num_count,1);
Insertsort(B,num_count);
matrix_out(B,num_count,0);
cout<<endl<<endl<<endl;
cout<<"折半插入排序:"<<endl;
num_copy(A,B,num_count);
matrix_out(B,num_count,1);
HalfInsert(B,num_count);
matrix_out(B,num_count,0);
cout<<endl<<endl<<endl;
cout<<"希尔排序:"<<endl;
num_copy(A,B,num_count);
matrix_out(B,num_count,1);
ShellSort(B,num_count);
matrix_out(B,num_count,0);
cout<<endl<<endl<<endl;
return 0;
}
这个代码是不对的。尤其希尔排序和折半插入排序,严老师骗我。