排序算法
学习数据结构和算法相关的知识,参考的书籍是《啊哈!算法》这本书籍,很多算法的书籍只适合当做工具书来查阅,(例如我的算法导论,现在还在垫桌角),所以找到一本简单易懂的算法书籍是非常重要的,当然很多算法还有深入的部分,这些都可以在自己心里面有了算法的基本概念之后再看工具书进行扩展的学习。
书里面的排序算法讲了三种:简易版桶排序(在本文后面我们都简称为桶排序),冒泡排序,快速排序。
首先的问题条件是让计算机随机读入五个数字之后将这五个数字从大到小进行输出,数字的范围是0–>10分。桶排序在这里的思想是利用大小为11的一维数组储存用户输入的数字,将数字大小所对应的下标,即1对应的一维数组就是a[1],6对应的一维数组就是a[6],输入相应的数字就将数组相应+1,然后我们想要从小到大或者从大到小都可以轻易做到了。
桶排序的是非常快的排序算法,但是它牺牲了空间来交换时间,想象一下我们需要输入的五个数字的范围是0–>100000000,虽然还是五个数字,但是却需要数组的空间为100000000,在空间上造成了极大的浪费。
第二个排序算法是冒泡排序,冒泡排序的基本思想是:每次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来。
简单来说,从小到大排序,我们从左边第一个数字开始,跟旁边的数字进行比较,如果比右边的数字大,我们就让这两个数字进行交换。接着我们比较第二个和第三个数字,将其中更大的一个数字交换到两个数字的右边去,这样一轮循环下来,就会将五个数字中最大的那个数字放在数组的最右边去。
然后我们进行第二轮循环,这次比较的范围是第一个数字到第四个数字(因为第五个数字已经是最大的了,他就没有再进行比较的必要),在这一轮比较之后,我们将数组中第二大的数字放在了数组的倒数第二个位置,以此类推,最终排出正确的顺序。
下面是实现的代码;
冒泡排序的核心是双重嵌套循环,而其冒泡排序的时间复杂度是O(N^2),虽然空间上占了优势,但是时间复杂度又比较高。
这个时候大家就会想有没有在空间和时间上都比较有优势的算法呢,这就是我们最后要讲到的快速排序。
快速排序的原理是将最左边的数字定为基准数,然后从数组最右端先开始寻找比基准数小的数字,找到了之后从最左端寻找比基准数大的数字,若两者没有相遇,则将两数字进行交换,接着继续进行寻找,直到两者相遇,则代表在基准数视角下左右两边排序已成功,接着我们将基准数回归到两者相遇位置,对于基准数左边和右边的数字分别进行排序,也是按照刚才相同的思想。
而快速排序的最坏的结果就是左右两端的数字每寻找一次就要进行交换,这样的话就跟冒泡排序是一样的了,但实际上不会这么倒霉的,所以它的平均时间复杂度为O(NlogN),因为它相对于冒泡排序,少了交换的那部分时间。而很明显在我们进行第二次排序的时候,将原来的数字序列分成了两个新的数字序列进行排序,这里又运用到了一种叫做二分的思想。
上代码
最后,书上第一章最后还有一个练习的习题,我直接复制过来了:
大家做了之后可以在添柴-编程学习网 进行验证,书上的链接已经改了:
https://www.acoj.com/problems/12001
下面是AC代码,我回车换行那里没有进行处理。
冒泡排序
__EOF__

本文链接:https://www.cnblogs.com/Cl0ud/p/12232399.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!