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

c语言实现快速排序

2013-10-26 23:59 176 查看

C语言下的快速排序

快速排序是一种优雅的算法,在最坏情况下,Quicksort可能需要 n^2 的时间来对数组元素进行排序。而在最优的情况下,它将选择中值作为划分元素,因此只需 nlgn 次的比较就可以完成数组的配需。 快速排序的基本思想是基于分治策略的。要研究这种算法,那么必须说到冒泡法排序,因为快速排序是对冒泡排序的一宗改进。它的基本思想是,通过一趟排序将戴记录分割成独立的两个部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行配需,以达整个序列有序。 作为一种分治策略包括三个步骤:分解-递归求解-合并;它包括三个核心部分:比较-置换-递归 。

假设要排序的数组是A[1]……A
,首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是:

1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;

2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];

3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;

4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;

5)、重复第3、4步,直到I=J;

例如:待排序的数组A的值分别是:(初始关键数据X:=49)

A[1] A[2] A[3] A[4] A[5] A[6] A[7]:

49 38 65 97 76 13 27

进行第一次交换后: 27 38 65 97 76 13 49

( 按照算法的第三步从后面开始找

进行第二次交换后: 27 38 49 97 76 13 65

( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时I:=3 )

进行第三次交换后: 27 38 13 97 76 49 65

( 按照算法的第五步将又一次执行算法的第三步从后开始找

进行第四次交换后: 27 38 13 49 76 97 65

( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时J:=4 )

此时再执行第三不的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27 38 13 49 76 97 65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。

快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:

初始状态 {49 38 65 97 76 13 27}

进行一次快速排序之后划分为 {27 38 13} 49 {76 97 65}

分别对前后两部分进行快速排序 {13} 27 {38}

结束 结束 49 {65} 76 {97}

2013年12月2日星期一

参考代码:

#include <stdio.h>

#include <time.h>
#include <string.h>

int partion(int num[], int, int);
void fast_sort(int num[], int, int);
void sort(int*, int*);
int main()
{
int num[10];
int i = 0;
int flag = 0;
int j = 0;
srand((unsigned int)time(NULL));//随机种子
for (i = 0;i < 10; i++)
{
num[i] = rand()%30+1;//随机生成10个随机数(0-30)
flag = i;
for (j = 0; j < flag; j++)//该循环是控制生成10个不重复的数
{
if (num[i] == num[j])
{
i--;
break;
}
}
}
puts(" befor sort is :\n");
for (i = 0; i < 10; i++)
{
printf("%d\t",num[i] );
}
puts("\n");
puts("after sort is:\n");
fast_sort(&num[0], 0, 9);
for (i = 0; i < 10; i++)
{
printf("%d\t",num[i] );
}
puts("\n");
return 0;
}

//分割
int partion(int num[], int low, int higt)
{

int flag = num[low];
int pivotkey = num[low];
while(low < higt)
{
while ((low<higt)&&(num[higt]>=pivotkey))
--higt;
sort(&num[low], &num[higt]);
while ((low<higt)&&(num[low]<=pivotkey))
++low;
sort(&num[low], &num[higt]);
}
num[low] = flag;
return low;
}
//进行递归的快速排序
void fast_sort(int num[], int low, int higt)
{
int pivot;
if (low < higt)
{
pivot = partion(num, low, higt);
fast_sort(num, low, pivot-1);
fast_sort(num, pivot+1, higt);
}
}
//交换函数
void sort(int *low, int *higt)
{
int tmp;
tmp = *low;
*low = *higt;
*higt = tmp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: