200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > C语言实现快速排序算法

C语言实现快速排序算法

时间:2022-07-07 00:33:35

相关推荐

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

程序结束

:)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。