C语言实现快速排序算法

快排作为公认最优秀的排序方法,是每一个程序员都应该掌握的,那么,今天就由我来为大家简单讲解一下快速排序算法的代码。

源代码如下:

#include<stdio.h>
void quicksort(int *a,int left,int right)
{
    if(left>right)
    {
        return ;
    }
    int i=left;
    int j=right;
    int key=a[left];
    while(i!=j)
    {
        while(a[j]>=a[left]&&i<j)
        {
            j--;
        }
        while(a[i]<=a[left]&&i<j)
        {
            i++;
        }
        int s;
        s=a[i];
        a[i]=a[j];
        a[j]=s;
    }
    a[left]=a[i];
    a[i]=key;
    quicksort(a,left,i-1);
    quicksort(a,i+1,right);
}
int main(void)
{
    int a[10]={6,7,8,9,10,5,3,2,4,1,};
    quicksort(a,0,9);
    int i;
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }    
}

以下是程序输出图

 下面是对于代码的讲解:

先简单讲解一下快速排序的原理,核心思想是递归。在一组数据中,我们先随机找一个数字(本程序中是最左边的数字也就是a[0])然后再利用两个指针i,j从数据二头向中间逼近,我们命名为left和right。left指向最左边,right指向最右边。当i变量找到一个值,这个值大于我们的标识值时,我们就把这个i记录下来,同理,我们再记录一个小于标识值的j,将a[i]与a[j]交换位置,直到i=j;

这是,我们将一开始的标识符与这是的a[i]交换位置,初步的快排就做好了,请注意,我们这里有一个陷阱!我现在这里卖一个关子

接着利用递归的思想,在标识符左右两端分别进行快排,直到我们的这个left=right为止。

 在函数的最开头,表现出来一种渴望,在子程序的递归中,一旦left>right了,nice!quicksort滴任务完成啦,直接return。

 确定标识值和copy一下left与right的值,方便下面操作

在i!=j这个大背景下,由于经过我们这个初步的快排之后,标识值左边的数统统小于标识值,标识值右边的数统统大于标识值,所以我们现在就开始找内鬼,有劳i与j了,j由于代表的是right,那么就要把小于标识值的抓到左边去,同理,i把大于标识值的送去右边。两者交换位置。

WARNING

还记得我刚刚卖的关子吗,我们程序的思路是将标识值与i与j值相等的那个数换位置,如果

 

我们这样进行,先找到左边的,在找到右边的,那么由于第一个循环先结束,i仍然小于j但是我们的这个值a[i]是大于a[left](不满足循环的条件)所以当我们进行交换这一步时,出现了错误,本来标识符左边的值应该统统小于它的,但是来了个内鬼(新换过去的)他的值大于标识值,所以程序出现了错误!

因此,为了避免此类错误,我们应该

 快排从右边开始!!!!!

 交换位置,完成了初步快排

进行递归,对标识符左边的元素和右边的元素分别在进行快排,直到i=j

程序结束

:)

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值