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

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

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

快速排序:最坏情况下运行时间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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值