#include<stdio.h>
#include<stdlib.h>
#define N 12
void swap(int * a,int * b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
//冒泡排序:
void bubble(int * a,int n)
{
int i,j;
bool change=true;
for(i=0;i<n-1&&change;i++)
{
change=false;
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
swap(a+j,a+j+1);
change=true;
}
}
}
//选择排序:
void select_sort(int * a,int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[k]>a[j])
k=j;
}
if(k!=i)
swap(a+k,a+i);
}
}
//直接插入排序:
void insert_sort(int * a,int n)
{
int i,j;
int t;
for(i=1;i<n;i++)
{
if(a[i]<a[i-1])
{
t=a[i];
for(j=i-1;j>=0&&a[j]>t;j--)
a[j+1]=a[j];
a[j+1]=t;
}
}
}
//折半插入排序:
void BInsertSort(int * a,int n)
{
int i,j,t;
int low,high,m;
for(i=1;i<n;i++)
{
if(a[i]<a[i-1])
{
t=a[i];
low=0;
high=i-1;
while(low<=high)
{
m=(low+high)/2;
if(a[m]>t)
high=m-1;
else
low=m+1;
} //退出while循环后,[high+1]为插入的位置;
for(j=i;j>=high+2;j--)
a[j]=a[j-1];
a[high+1]=t;
}
}
}
//希尔排序(缩小增量排序);
void shell_insert(int * a,int n,int dlt)
{
int i,j;
int t;
for(i=dlt;i<n;i++)
{
if(a[i]<a[i-dlt])
{
t=a[i];
for(j=i-dlt;j>=0&&t<a[j];j-=dlt)
{
a[j+dlt]=a[j];
}
a[j+dlt]=t;
}
}
}
void shell_sort(int * a,int n,int * dlt,int k)
{
int i;
for(i=0;i<k;i++)
shell_insert(a,n,dlt[i]);
}
void show(int*a,int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
//快速排序(用递归实现);
void quick_sort(int * a,int s,int t)
{
int low,high;
int pivot; //枢轴
low=s;
high=t;
if(low<high)
{
pivot=a[low];
while(low<high)
{
while(low<high&&a[high]>=pivot)
high--;
a[low]=a[high];
while(low<high&&a[low]<=pivot)
low++;
a[high]=a[low];
}
a[low]=pivot;
quick_sort(a,s,low-1);
quick_sort(a,low+1,t);
}
}
//堆排序:
void heap_adjust(int*a,int s,int t) //a[s...t]中除a[s]外,其他均符合堆的定义;
{
int temp;
int i;
temp=a[s];
for(i=s*2;i<=t;i*=2)
{
if(a[i]<a[i+1]&&i<t) //此处特别容易掉一个条件!!!
i++;
if(temp<a[i])
{
a[s]=a[i];
s=i;
}
else
break;
}
a[s]=temp;
}
void heap_sort(int * a,int n) //对a[1...n]进行堆排序
{
int i;
for(i=n/2;i>=1;i--)
{
heap_adjust(a,i,n);
}
for(i=n;i>1;i--)
{
swap(a+1,a+i);
heap_adjust(a,1,i-1);
}
}
/*
//归并排序:(递归的方法)
void merge(int *a,int s,int m,int t,int *b) //将a[s...m]与a[m+1...t]归并为a[s...t];
{
int i,j;
int k;
int p;
i=s;
j=m+1;
k=s;
while(i<=m&&j<=t)
{
if(a[i]<a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
// while(i<=m)
// b[k++]=a[i++];
// while(j<=t)
// b[k++]=a[j++];
if(i<=m)
{
for(p=0;p<=m-i;p++)
b[k+p]=a[i+p];
}
if(j<=t)
{
for(p=0;p<=t-j;p++)
b[k+p]=a[j+p];
}
}
#define MAX 100
void Msort(int *a,int s,int t,int * b) //将a[s...t]排序为b[s...t]
{
int m;
// int *c=(int *)malloc(sizeof(int)*(t-s+1));
int c[MAX];
if(s==t)
{
b[s]=a[s];
}
else
{
m=(s+t)/2;
Msort(a,s,m,c);
Msort(a,m+1,t,c);
merge(c,s,m,t,b);
}
}
void merge_sort(int * a,int n)
{
Msort(a,0,n-1,a);
}
*/
//归并排序的非递归算法:
void merge(int *a,int s,int m,int t) //将a[s...m]与a[m+1...t]归并为a[s...t];
{
int *b=(int *)malloc(sizeof(int)*(t-s+1));
int i,j,k;
i=s;
j=m+1;
k=0;
while(i<=m&&j<=t)
{
if(a[i]<a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
while(i<=m)
b[k++]=a[i++];
while(j<=t)
b[k++]=a[j++];
for(k=0,i=s;i<=t;i++,k++)
a[i]=b[k];
free(b);
}
void mergePass(int *a,int n,int len)
{
int i;
for(i=0;i+len*2-1<n;i=i+len*2)
{
merge(a,i,i+len-1,i+len*2-1);
}
if(i+len-1<n)
merge(a,i,i+len-1,n-1);
}
void merge_sort(int * a,int n)
{
int len;
for(len=1;len<n;len*=2)
{
mergePass(a,n,len);
}
}
#define K 4
int main()
{
int i;
int a[N]={3,1,6,43,2,74,84};
int dlt[K]={7,5,3,1};
for(i=0;i<N;i++)
a[i]=rand()%100;
show(a,N);
// bubble(a,N);
// show(a,N);
// select_sort(a,N);
// show(a,N);
// insert_sort(a,N);
// show(a,N);
// BInsertSort(a,N);
// show(a,N);
// shell_sort(a,N,dlt,K);
// quick_sort(a,0,N-1);
// heap_sort(a,N-1);
merge_sort(a,N);
show(a,N);
return 0;
}
几种排序的总结
最新推荐文章于 2021-12-09 20:53:53 发布