排成绩快速排序c语言代码,数据结构C语言实现----快速排序

快速排序算法

首先看下面这个例子:

61f3355abc1f3159985e4f4d8810bceb.png

我们取第一个元素为基准元素:

b20068cdf0cb0c90071157179ef56ed6.png

之后,从右边开始与基准元素挨个比较,如果比基准元素大,右指针往左移,如果比基准元素小,就与左指针指的元素交换(因为左指针永远停留在一个

空白的值上,不用担心值被覆盖)

4的值比5小,所以左右指针的值交换,右指针就变成空的了:

3b61a3cf0f3479eb39996bbe05d3f707.png

一旦完成交换操作,另一个指针就要开始移动了!

(交换完成后,左指针要立刻右移一下,因为接下来判断左指针是否右移的条件是元素与基准的比较,交换完成后左指针指向的元素交换前已经比较过了)

左指针开始右移,指向的元素与基准元素比较,比基准小左指针继续右移,比基准元素大,就与右指针交换

4比5小,左指针右移:

5197d3b13f9e3fe63d7026de9686a0a1.png

9比5大,与右指针交换:

8bc0d9183a42e6d2bb016dee5e27fe2f.png

一旦完成交换操作,另一个指针就要开始移动了!

(交换完成后,右指针要立刻左移一下,因为接下来判断右指针是否左移的条件是元素与基准的比较,交换完成后右指针指向的元素交换前已经比较过了)

右指针开始左移,第一个元素小于基准

左右指针的值交换:

5cae39f21fe0ab02ea6ee20fe35cb4ee.png

交换完成左指针应该立刻右移一位:

eab377be03f57e2ca031b81e81f553c4.png

左指针开始右移

第一个元素0,小于基准,继续右移

下一个元素4也小于基准,继续右移

来到元素7,大于基准,指针的值交换:

581adafe4ebb1654272770813dbab63e.png

交换完成后,右指针立刻左移一位:

1512ec5f034194b28b00b3f094927e28.png

元素8大于基准,所以右指针继续左移:

605f73c3781e20ea130b7e0b434c3fe6.png

元素4小于基准,交换值:

a1906a0bfb2e6236e9452a905b57fdad.png

交换完成,左指针立刻右移一下:

7d3c8662ce838d910b4079fb9a64b1fd.png

此时左右指针重合,重合位置放入基准元素:

cbd4189a62ccd4761bfa5505dd088d89.png

让后基准元素左面都比他小,右面都比他大,左右两个子列再套用上述方法,直至排序结束!

通过分析上面的例子,我们知道,快速排序大体分这么几步:

while(左指针在右指针的左边)

{

while(右指针指向的元素大于基准)

{

右指针右移

}

//退出了上面这个循环说右指针移动到了一个小于基准的元素下面

将右指针指向的值赋值给左指针指向的值

左指针立刻右移一下

while(左指针指向的元素小于基准元素)

{

左指针右移一位

}

//退出了上面这个循环说明左指针移动到了一个大于基准的元素下面

将左指针指向的值赋值给右指针指向的值

右指针立刻左移一下

}

最后左右指针会重合,重合的位置赋值为基准元素的值;

左子列重复快速排序;

右子列重复快速排序;

运行结果:

5fd6ea4792a6e7be3b375c1ac4ad7c17.png

源码如下:

#include

typedef int keytype;

//快速排序

void quicksort(keytype k[] , int ArrayLeft , int ArrayRight)

{

int left = ArrayLeft;

int right = ArrayRight;

int temp = k[left];

if (left < right)

{

while (left < right)

{

while (left < right && k[right] >= temp)

{

right--;

}

//if (k[right] < temp)

{

k[left] = k[right];

left++;

}

while(left < right && k[left] <= temp)

{

left++;

}

//if (k[left] > temp)

{

k[right] = k[left];

right--;

}

}

k[left] = temp;

quicksort(k,ArrayLeft,left-1);

quicksort(k,right+1,ArrayRight);

}

}

#define MAX 100

int main()

{

//读取一串数字

printf("请输入一串无序数字:");

int c;

int n = 1;

keytype k[MAX];

while ((c = getchar())!='\n')

{

k[n++] = c-'0';

}

if (c == '\n')

{

k[n] = '\0';

}

//快速排序

quicksort(k,1,n-1);

printf("这串数字从小到大为:");

for (size_t i = 1; i <= n-1; i++)

{

printf("%d",k[i]);

}

return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值