您的位置:首页 > 编程语言 > C语言/C++

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

2013-12-18 18:05 253 查看
老师要求做排序的课程设计,在网上找到的代码,看着不错,收藏了

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

快速排序:最坏情况下运行时间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");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: