转自:/作者:编程小梦 网址:www.bcmeng.com
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef int datatype;
void SelectSort(datatype x[],int n) //选择排序
{
int i,j,k;
datatype temp;
for(i=0;i<n;i++)
{
k=i;
for(j=i;j<n;j++) //从无序区选择最小元素
if(x[k]>x[j])
k=j; //用K指出每趟在无序区的最小元素
temp=x[i]; //将想x[i]和x[k]交换
x[i]=x[k];
x[k]=temp;
}
}
void BubbleSort(datatype x[],int n)//冒泡排序
{
int i,j;
datatype temp;
for(i=0;i<n-1;i++)
{
for(j=n-1;j>i;j--)//比较,找出最小关键字的记录
if(x[j]<x[j-1])
{temp=x[j];//x[j]与[j-1]进行交换,将最小关键字记录前移
x[j]=x[j-1];
x[j-1]=temp;
}
}
}
void InsertSort(datatype x[],int n)//直接插入排序
{
int i,j;
datatype temp;
for(i=1;i<n;i++)
{
temp=x[i];
j=i-1;
while(j>=0&&temp<x[j]) //元素后移,以便腾出一个位置插入temp
{
x[j+1]=x[j];
j--;
}
x[j+1]=temp; //在j+1位置处插入temp即想x[i]
}
}
void ShellSort(datatype x[],int n)//希尔排序
{
int i,j,gap;
datatype temp;
gap=n/2; //增量置初值
while(gap>=1)
{
for(i=gap;i<n;i++) //对所有相隔gap位置的元素组进行排序
{
temp=x[i];
j=i-gap;
while(j>=0&&temp<x[j])//对相隔gap位置的元素组进行排序
{
x[j+gap]=x[j];
j=j-gap;
}
x[j+gap]=temp;
}
gap=gap/2; //减小增量
}
}
void Sift(datatype x[],int low,int high)
{
int i=low,j=2*i+1; //x[j]是x[i]的左孩子。因为下标是从0开始。
datatype temp=x[i];
while(j<high)
{
if(j<high&&x[j]<x[j+1])//若右孩子较大,把J指向右孩子
j++;
if(temp<x[j])
{
x[i]=x[j]; //将x[j]调整到双亲结点上
i=j;//修改i和j的值,以便继续向下筛选
j=2*i+1;
}
else break; //筛选结束
}
x[i]=temp;//被筛选结点的值放入最终位置
}
void HeapSort(datatype x[],int n) //堆排序
{
int i;
datatype temp;
for(i=n/2;i>=0;i--) //循环建立初始堆
Sift(x,i,n);
for(i=n-1;i>=1;i--) //进行n-1次循环,完成堆排序
{
temp=x[0];//将第一个元素同当前区间内x[1]交换
x[0]=x[i];
x[i]=temp;
Sift(x,0,i-1);//筛选x[1]结点,得到i-1个结点的堆
}
}
void QuickSort(datatype x[],int s,int t)//快速排序
{
int i=s,j=t;
datatype temp;
if(s<t&&s>=0&&j>=0)//区间内至少存在一个元素且元素均大于0
{
temp=x[s]; //用区间的第一个元素作为基准
while(i!=j) //从区间俩端交替向中间扫描,知道i=j为止
{
while(j>i&&x[j]>temp)
j--; //从右向左扫描,直到第一个元素小于temp
if(i<j) //表示找到这样的x[j],x[i]和x[j]交换
{
x[i]=x[j];
i++;
}
while(i<j&&x[i]<temp)
i++;//从左向右扫描,直到第一个元素大于temp
if(i<j)
{
x[j]=x[i];//表示找到这样的x[i],x[i]和x[j]交换
j--;
}
}
x[i]=temp;
QuickSort(x,s,i-1);//对左区间递归排序
QuickSort(x,i+1,j);//对右区间递归排序
}
}
void Merge (datatype x[],int low,int mid,int high) //归并排序
{
datatype *x1;
int i=low ,j=mid+1,k=0;//k是x1的下标,i,j分别为第一,二段的下标
x1=(datatype*)malloc ((high-low+1)*sizeof(datatype));//动态分配空间
while(i<=mid&&j<=high)//在第一段和第二段未扫描完时继续循环
if(x[i]<=x[j])
{
x1[k]=x[i]; //将第一段的记录放入x1中
i++;
k++;
}
else
{
x1[k]=x[j];//将将第二段的记录放入x1中
j++;
}
while(i<=mid) //将第一段余下部分复制到x1
{
x1[k]=x[i];
k++;
i++;
}
while(j<=high)//将第二段余下部分复制到x1
{
x1[k]=x[j];
j++;
k++;
}
for(k=0,i=low;i<=high;k++,i++)
x[i]=x1[k]; //将x1复制回x中
}
void MergePass(datatype x[],int length,int n)
{
int i;
for(i=0;i+2*length-1<n;i=i+2*length) //归并length长的俩相邻子表
Merge(x,i,i+length-1,i+2*length-1);
if(i+length-1<n) //余下俩个子表,后者长度小于lengtth
Merge(x,i,i+length-1,n-1); //归并这俩个子表
}
void MergeSort(datatype x[],int n) //二路归并算法
{
int length;
for(length=1;length<n;length=2*length)
MergePass(x,length,n);
}
void Create(datatype x[],int n)
{ int i;
for(i=0;i<n;i++)
scanf("%d",&x[i]);
}
void Display(datatype x[],int n)
{ int i;
for(i=0;i<n;i++)
printf("%d ",x[i]);
}
int main()
{ datatype x[maxsize];
int n;
printf("请输入数组的大小:\n");
scanf("%d",&n);
printf("\n请输入数组元素:\n");
Create(x,n);
MergeSort(x,n);
Display(x,n);
}