c语言实现快速排序

C语言下的快速排序

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

 

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

  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;
}

转载于:https://www.cnblogs.com/wxishang/p/3390249.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值