void insertsort(int a[],int n) //简单插入排序
{
int i,j,k,t;
for(i=1;i<n;i++)
for(j=0;j<i;j++)
if(a[j]>a[i])
{
t=a[i];
for(k=i;k>j;k--) a[k]=a[k-1];
a[j]=t;
break;
}
}
void InsertSort(int a[],int n) //折半插入排序
{
int i,j,temp,low,high,m;
for(i=1;i<n;i++)
{
temp=a[i];
low=0;high=i-1;
while(low<=high)
{
m=(low+high)/2;
if(temp<a[m]) high=m-1;
else low=m+1;
}
for(j=i-1;j>=low;j--) a[j+1]=a[j];
a[low]=temp;
}
}
typedef struct{ //表插入排序(不需要移动元素 )
int a;
int next; //指针,指向比a大一点的数
}slnode;
void arrange(slnode r[],int n)
{
int i,p,q;
slnode t;
p=r[0].next;
for(i=1;i<n;i++)
{
while(p<i) p=r[p].next;
q=r[p].next; //必须有
if(p!=i)
{
t=r[p];r[p]=r[i];r[i]=t;
r[i].next=p;
}
p=q;
}
}
void listinsertsort(int aa[],int n) //表插入排序(不需要移动元素 )
{
int i;
int j,j0;
const int maxint=20000;
slnode r[n+1];
r[0].a=maxint;r[0].next=1;
r[1].next=0;
for(i=0;i<10;i++)
r[i+1].a=aa[i];
for(i=2;i<11;i++)
{
j=r[0].next;
j0=0;
while(r[i].a>r[j].a) {j0=j;j=r[j].next;}
r[j0].next=i;
r[i].next=j;
}
arrange(r,n+1);
for(i=0;i<10;i++)
aa[i]=r[i+1].a;
}
void shellinsert(int a[],int n,int m)
{
//功能:以m为增量对a进行插入排序
int i,j,t;
for(i=m;i<n;i++)
if(a[i]<a[i-m])
{
t=a[i];
for(j=i-m;j>=0&&t<a[j];j-=m)
a[j+m]=a[j];
a[j+m]=t;
}
}
void shellsort(int a[],int n) //shell排序(属于高效排序)
{
int k=n;
k=(5*k-1)/11; //取序列是a(n)=(5n-1)/11
while(k>=2)
{
shellinsert(a,n,k);
k=(5*k-1)/11;
}
shellinsert(a,n,1);
}
//起泡排序用的很少,此处省略
void quicksort1(int a[],int m,int n) //快速排序(最简单的高效排序)
{
int i,j;
int temp;
if(m>=n)
return;
i=m;
j=n;
temp=a[i]; //以a[m]为枢轴
while(i<j)
{
while(temp<=a[j]&&i<j)
j--;
a[i]=a[j];
while(temp>=a[i]&&i<j)
i++;
a[j]=a[i];
}
a[i]=temp;
quicksort1(a,m,i-1);
quicksort1(a,i+1,n);
}
void quicksort2(int a[],int m,int n) //快速排序(最简单的高效排序)
{
int i,j,mid=(m+n)/2;
int temp;
if(m>=n)
return;
i=m; j=n;
temp=a[mid];
while(temp>=a[i]&&i<mid)
i++;
if(i<mid)
a[mid]=a[i]; //以a[mid]为枢轴(也可以选取a[m],a[mid],
//a[n]中的中值,可以改进快速在最坏情况下的性能)
while(i<j)
{
while(temp<=a[j]&&i<j)
j--;
a[i]=a[j];
while(temp>=a[i]&&i<j)
i++;
a[j]=a[i];
}
a[i]=temp;
quicksort2(a,m,i-1);
quicksort2(a,i+1,n);
}
void merge(int a[],int b[],int i,int m,int n)
{
//函数功能:将有序列a[i,...,m]和a[m+1,....,n]归并为有序列b[i,...,n]
int j,k,t;
for(j=m+1,k=i;i<=m&&j<=n;k++)
{
if(a[i]>a[j]) b[k]=a[j++];
else b[k]=a[i++];
}
if(i<=m)
for(t=0;t<=m-i+1;t++)
b[k+t]=a[i+t];
if(j<=n)
for(t=0;t<=n-j+1;t++)
b[k+t]=a[j+t];
}
void msort(int a[],int b[],int s,int t) //2路 并归排序(用的不多)
{
int m,c[t-s+1];
if(s==t)
b[s]=a[s];
else
{
m=(s+t)/2;
msort(a,c,s,m);
msort(a,c,m+1,t);
merge(c,b,s,m,t);
}
}
void selectsort(int a[],int n)
{ //简单选择排序...
int i,j,k,t;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(a[j]<a[k])
k=j;
if(k!=i)
{
t=a[k];a[k]=a[i];a[i]=t;
}
}
}
void heapadjust(int a[],int s,int m) //堆排序..
{
//功能:若a[s...m]中只有a[s]不满足堆的定义,调用此函数可以使a[s...m]成为一个大顶堆
//(堆顶元素最大)
int t,j;
t=a[s];
for(j=2*(s+1);j<=m+1;j*=2)
{
if(j<m+1&&a[j-1]<a[j]) j++;
if(t>=a[j-1])
break;
a[s]=a[j-1];s=j-1;
}
a[s]=t;
}
void heapsort(int a[],int n) //堆排序.
{
int i,t;
for(i=n/2;i>0;i--)
heapadjust(a,i-1,n-1);
for(i=n;i>1;i--)
{
t=a[0];a[0]=a[i-1];a[i-1]=t;
heapadjust(a,0,i-2);
}
}
void JOSort(int a[],int n) //奇偶排序
{
int i,flag,t;
do{
flag=0;
for(i=1;i<n;i+=2)
if(a[i]<a[i-1])
{flag=1; t=a[i];a[i]=a[i-1];a[i-1]=t;}
for(i=2;i<n;i+=2)
if(a[i]<a[i-1])
{flag=1; t=a[i];a[i]=a[i-1];a[i-1]=t;}
}while(flag==1);
}
void countsort1(int a[],int b[],int n) //记数排序
{
//最差的排序方法
int i,j,count,visited[n];
for(i=0;i<n;i++)
visited[i]=i; //为了辨别a中相同的数而设的标志数组
for(i=0;i<n;i++)
{
count=0;
for(j=0;j<n;j++)
if(a[j]<a[i]) count++;
while(visited[count]==-1)
count++;
visited[count]=-1;
b[count]=a[i];
}
}
void countsort2(int a[],int b[],int n) //记数排序
{
//改进的记数排序
int i,j,c[n];
for(i=0;i<n;i++)
c[i]=0;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
if(a[i]>a[j]) c[i]++;
else c[j]++;
b[c[i]]=a[i];
}
}
{
int i,j,k,t;
for(i=1;i<n;i++)
for(j=0;j<i;j++)
if(a[j]>a[i])
{
t=a[i];
for(k=i;k>j;k--) a[k]=a[k-1];
a[j]=t;
break;
}
}
void InsertSort(int a[],int n) //折半插入排序
{
int i,j,temp,low,high,m;
for(i=1;i<n;i++)
{
temp=a[i];
low=0;high=i-1;
while(low<=high)
{
m=(low+high)/2;
if(temp<a[m]) high=m-1;
else low=m+1;
}
for(j=i-1;j>=low;j--) a[j+1]=a[j];
a[low]=temp;
}
}
typedef struct{ //表插入排序(不需要移动元素 )
int a;
int next; //指针,指向比a大一点的数
}slnode;
void arrange(slnode r[],int n)
{
int i,p,q;
slnode t;
p=r[0].next;
for(i=1;i<n;i++)
{
while(p<i) p=r[p].next;
q=r[p].next; //必须有
if(p!=i)
{
t=r[p];r[p]=r[i];r[i]=t;
r[i].next=p;
}
p=q;
}
}
void listinsertsort(int aa[],int n) //表插入排序(不需要移动元素 )
{
int i;
int j,j0;
const int maxint=20000;
slnode r[n+1];
r[0].a=maxint;r[0].next=1;
r[1].next=0;
for(i=0;i<10;i++)
r[i+1].a=aa[i];
for(i=2;i<11;i++)
{
j=r[0].next;
j0=0;
while(r[i].a>r[j].a) {j0=j;j=r[j].next;}
r[j0].next=i;
r[i].next=j;
}
arrange(r,n+1);
for(i=0;i<10;i++)
aa[i]=r[i+1].a;
}
void shellinsert(int a[],int n,int m)
{
//功能:以m为增量对a进行插入排序
int i,j,t;
for(i=m;i<n;i++)
if(a[i]<a[i-m])
{
t=a[i];
for(j=i-m;j>=0&&t<a[j];j-=m)
a[j+m]=a[j];
a[j+m]=t;
}
}
void shellsort(int a[],int n) //shell排序(属于高效排序)
{
int k=n;
k=(5*k-1)/11; //取序列是a(n)=(5n-1)/11
while(k>=2)
{
shellinsert(a,n,k);
k=(5*k-1)/11;
}
shellinsert(a,n,1);
}
//起泡排序用的很少,此处省略
void quicksort1(int a[],int m,int n) //快速排序(最简单的高效排序)
{
int i,j;
int temp;
if(m>=n)
return;
i=m;
j=n;
temp=a[i]; //以a[m]为枢轴
while(i<j)
{
while(temp<=a[j]&&i<j)
j--;
a[i]=a[j];
while(temp>=a[i]&&i<j)
i++;
a[j]=a[i];
}
a[i]=temp;
quicksort1(a,m,i-1);
quicksort1(a,i+1,n);
}
void quicksort2(int a[],int m,int n) //快速排序(最简单的高效排序)
{
int i,j,mid=(m+n)/2;
int temp;
if(m>=n)
return;
i=m; j=n;
temp=a[mid];
while(temp>=a[i]&&i<mid)
i++;
if(i<mid)
a[mid]=a[i]; //以a[mid]为枢轴(也可以选取a[m],a[mid],
//a[n]中的中值,可以改进快速在最坏情况下的性能)
while(i<j)
{
while(temp<=a[j]&&i<j)
j--;
a[i]=a[j];
while(temp>=a[i]&&i<j)
i++;
a[j]=a[i];
}
a[i]=temp;
quicksort2(a,m,i-1);
quicksort2(a,i+1,n);
}
void merge(int a[],int b[],int i,int m,int n)
{
//函数功能:将有序列a[i,...,m]和a[m+1,....,n]归并为有序列b[i,...,n]
int j,k,t;
for(j=m+1,k=i;i<=m&&j<=n;k++)
{
if(a[i]>a[j]) b[k]=a[j++];
else b[k]=a[i++];
}
if(i<=m)
for(t=0;t<=m-i+1;t++)
b[k+t]=a[i+t];
if(j<=n)
for(t=0;t<=n-j+1;t++)
b[k+t]=a[j+t];
}
void msort(int a[],int b[],int s,int t) //2路 并归排序(用的不多)
{
int m,c[t-s+1];
if(s==t)
b[s]=a[s];
else
{
m=(s+t)/2;
msort(a,c,s,m);
msort(a,c,m+1,t);
merge(c,b,s,m,t);
}
}
void selectsort(int a[],int n)
{ //简单选择排序...
int i,j,k,t;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(a[j]<a[k])
k=j;
if(k!=i)
{
t=a[k];a[k]=a[i];a[i]=t;
}
}
}
void heapadjust(int a[],int s,int m) //堆排序..
{
//功能:若a[s...m]中只有a[s]不满足堆的定义,调用此函数可以使a[s...m]成为一个大顶堆
//(堆顶元素最大)
int t,j;
t=a[s];
for(j=2*(s+1);j<=m+1;j*=2)
{
if(j<m+1&&a[j-1]<a[j]) j++;
if(t>=a[j-1])
break;
a[s]=a[j-1];s=j-1;
}
a[s]=t;
}
void heapsort(int a[],int n) //堆排序.
{
int i,t;
for(i=n/2;i>0;i--)
heapadjust(a,i-1,n-1);
for(i=n;i>1;i--)
{
t=a[0];a[0]=a[i-1];a[i-1]=t;
heapadjust(a,0,i-2);
}
}
void JOSort(int a[],int n) //奇偶排序
{
int i,flag,t;
do{
flag=0;
for(i=1;i<n;i+=2)
if(a[i]<a[i-1])
{flag=1; t=a[i];a[i]=a[i-1];a[i-1]=t;}
for(i=2;i<n;i+=2)
if(a[i]<a[i-1])
{flag=1; t=a[i];a[i]=a[i-1];a[i-1]=t;}
}while(flag==1);
}
void countsort1(int a[],int b[],int n) //记数排序
{
//最差的排序方法
int i,j,count,visited[n];
for(i=0;i<n;i++)
visited[i]=i; //为了辨别a中相同的数而设的标志数组
for(i=0;i<n;i++)
{
count=0;
for(j=0;j<n;j++)
if(a[j]<a[i]) count++;
while(visited[count]==-1)
count++;
visited[count]=-1;
b[count]=a[i];
}
}
void countsort2(int a[],int b[],int n) //记数排序
{
//改进的记数排序
int i,j,c[n];
for(i=0;i<n;i++)
c[i]=0;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
if(a[i]>a[j]) c[i]++;
else c[j]++;
b[c[i]]=a[i];
}
}