c语言冒泡排序_c语言高频面试题,冒泡排序快速排序标准思路讲解,超详细敲黑板...

又是那个熟悉的up主,由于之前文章排版问题这个重发一下,那我们我们今天来介绍一些c语言几大排序中的快速排序,和冒泡排序首先介绍一些冒泡排序:

基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。说直白点就是如果我要升序那么最小的放前面,最大的放后面,每次上一个和下一个比较,大的放后面

a3aa0b8fb94ab47a8629ada8b0fbef4c.png

此图为排序算法总结为方便理解,找了一些图片,此图片来自博客园!Vincent博主,特此鸣谢

那么上最简单代码:

a4051fcbf42281d7338abff9f0281b2b.png

冒泡排序代码,由于这个电脑没有装编译器,就用的头条代码块截图,排版可能不好看

6eb2cef7188f4936d672e6c562dbb765.png

冒泡排序示意图,来自博客园静默虚空,特此鸣谢

以上图为例,演示一下冒泡排序的实际流程:

假设有一个无序序列 { 4. 3. 1. 2, 5 }

第一趟排序:通过两两比较,找到第一小的数值 1 ,将其放在序列的第一位。

第二趟排序:通过两两比较,找到第二小的数值 2 ,将其放在序列的第二位。

第三趟排序:通过两两比较,找到第三小的数值 3 ,将其放在序列的第三位。

至此,所有元素已经有序,排序结束。


快速排序:

基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小(分区),然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

由于不想做图片,我们就借一下,有借有还,代码思维自己的,博客园技术up主应该不会小气

我们用图解再上自己的代码:

由于图片上用这几个,我们也用这几个方便理解数组,思想用自己的就ok啦

(6, 1, 2, 7, 9, 3, 4, 5, 10, 8);

1.首先我们需要选取一个key值;也叫基准值,用它来分区,那我们我们随便选一个6

a5dff6e6a38a508eed30f1e2b51724da.png

图片来自于心月IT博客,特此鸣谢

2.i为第一个数的下标,j为最后一个数的下标,也就是上面的两个小兵;

从数组最后一个数arr[j]从右往左找,找到的第一个小于key(6)的数记为arr[j]

同理:从数组的第一个数arr[i]从左往右找,找到的第一个大于key的数记为arr[i];

我们就用从小到大排列

j往左一步就是j--,直到找到一个小于6的数停下来。接下来i向右找就是i++,直到找到一个数大于6的数停下来。j下标停在了5,i停在了数字7。

然后交换下标所对应的值

3ab227985018d79efec556731e1d25ad.png

图片来自于心月IT博客,特此鸣谢,

就会变成这样

然后依次类推再找,还是j--,i++;分别找到4和9

4d06505aa9b4a31f4753a5abd1cda5fe.png

图片来自于心月IT博客,特此鸣谢,

然后交换;

1064e726459e66da780a193d801f318c.png

图片来自于心月IT博客,特此鸣谢,

最后我们会发现i和j碰头了,发现3比6小,这时候我们把key基准值和他们碰头的值交换

就完成了第一趟快排;也就形成了分区,左边比6小,右边比6大,再利用回调函数,对分区多几次这样的快排就可以发现排序好了,速度非常快(你们快了,up主写累了)

然后我们上程序详解:

头条这个代码块应该加个tab自动空4格不然代码块写着有问题,而且容易排版缺失,怎么愉快的写代码

cbab52af7bcf55481a4b76f7337e343d.png

直接用头条代码块会出现排序混乱缺少,只能截下来

41f00587a412c71f20a4f2a3d9ddc05a.png

实验了一下没问题


好了写完了两个小时,终于还是通宵了,如有错误请指正喔,复习,看不懂的课可以评论问我都会回的

我觉得我讲的很通俗易懂了,

码字不易,喜欢的话关注,点赞,收藏跪求三连,这样良心的up主太少了,你的每一个点赞都是我的动力;

d54a0402648b659f3fd8a90ba5c862f1.gif

最后如果需要转载请私信我-------------------------------------------------------------------------------------------------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值