c语言归并排序和快速排序

来源:互联网 发布:linux 存储系统 编辑:程序博客网 时间:2024/05/20 09:46

老师要求做排序的课程设计,在网上找到的代码,看着不错,收藏了

归并排序和快速排序都是高效的排序算法。

快速排序:最坏情况下运行时间O(n^2),平均运行时间O(nlogn),不需要辅助空间。不稳定的排序。

归并排序:最好和最坏下,运行时间都为O(nlogn),需要辅助空间,稳定的排序。

实现:

/************************************************************************/
/* coder:huifeng00
/* 时间:2010-5-19 下午3点
/* 功能:利用分治法递归实现归并排序和快速排序
/* 语言:C
/************************************************************************/

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
//归并排序
void MergeSort(int *data,int x,int y,int *temp)//x,y分别表示数组中的位置,是[x,y)
{
int p,q,m,i=x;
if (y-x>1)//表示至少2个元素
{
m = x+(y-x)/2;
p = x;//p记录前半部分索引
q = m;//q记录后半部分索引
MergeSort(data,x,m,temp);//分治递归调用分别对前半部分和后半部分进行归并排序
MergeSort(data,m,y,temp);

while(p<m||q<y)//表示前半部分序列和后半部分序列只要有一个没有遍历完
{
if (q>=y||(p<m&&data[p]<data[q]))
{
temp[i++] = data[p++];//复制前半部分
}
else
{
temp[i++] = data[q++];//复制后半部分
}
}

for(i=x;i<y;i++)
data[i] = temp[i];//把临时空间的值复制到原数组
}
}

//快速排序
void HoareSort(int *data,int x,int y)//函数名为HoareSort是因为这个算法是由Hoare他提出的,也是[x,y)
{
int p=x,q=y-1,temp;//p,q分别指向数组首尾,以首元素数据为基点划分,temp用来交换数据的临时变量
while(p<q)//保证最少2个数据才进行划分
{
while (q>p&&data[q]>=data[p])//注意保证q>p防止基点与自身比较
q--;
if (q>p)
{
temp = data[p],data[p] = data[q],data[q] =temp;
p++;
}
while(q>p&&data[p]<=data[q])//注意保证q>p防止基点与自身比较
p++;
if (p<q)
{
temp = data[p],data[p] = data[q],data[q] =temp;
q--;
}
if (p==q)//找到基点位置
{
HoareSort(data,x,p);//分治分别对基点前半部分和后半部分进行快速排序
HoareSort(data,p+1,y);
}
}
}
int main()
{
int data[10],i;//设置10个数据排序
int temp[10];//这是临时空间
srand(time(NULL));//设置随机数种子
for (i=0;i<10;i++)//随机生成0-99之间的10个数进行排序,可以重复
{
data[i] = rand()%100;
}
for (i=0;i<10;i++)//输出未排序数据
{
printf("%d ",data[i]);
}
printf("\n");
//MergeSort(data,0,10,temp);
HoareSort(data,0,10);
for (i=0;i<10;i++)//输出排序数据
{
printf("%d ",data[i]);
}
printf("\n");
}

0 0