代码说明
代码是我亲自码的,调试通过的,代码中有算法思想和详细的注释,一目了然。
项目已经上传到我的github:https://github.com/yisun03/sort
项目中还有另外得九种排序算法的c++实现代码以及其思想。
十种排序算法清代如下(附我的blog链接): 1 选择排序:https://blog.csdn.net/weixin_39408343/article/details/107063290 2 插入排序:https://blog.csdn.net/weixin_39408343/article/details/107070155 3 冒泡排序:https://blog.csdn.net/weixin_39408343/article/details/107070658 4 希尔排序:https://blog.csdn.net/weixin_39408343/article/details/107071758 5.1 归并排序递归实现:https://blog.csdn.net/weixin_39408343/article/details/107083607 5.2 归并排序非递归实现:https://blog.csdn.net/weixin_39408343/article/details/107084688 6.1 快速排序递归实现:https://blog.csdn.net/weixin_39408343/article/details/107086104 6.2 快速排序非递归实现:https://blog.csdn.net/weixin_39408343/article/details/107087359 7 堆排序:https://blog.csdn.net/weixin_39408343/article/details/107092851 8 计数排序:https://blog.csdn.net/weixin_39408343/article/details/107094547 9 桶排序:https://blog.csdn.net/weixin_39408343/article/details/107113821 10 基数排序:https://blog.csdn.net/weixin_39408343/article/details/107115403术语说明
1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。
2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。
3、原地排序:原地排序指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。
4、非原地排序:需要利用额外的数组来辅助排序。
5、时间复杂度:一个算法执行所消耗的时间。
6、空间复杂度:运行完一个算法所需的内存大小。
性能分析
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定的原地排序
void sort::sort_bubble(std::vector<int> &data) { // 思想: // 在原始待排序序列上操作; // 将原始待排序序列分成无序区和有序区两部分; // 初始状态下整个原始序列为无序区,每遍历一遍就浮现出无序区最大的元素放在有序区; // 随着遍历,最终无序区长度变为0,整个原始序列变为有序序列. // 设置一个监控位,用于记录是否无序区碰巧为有序的,那么便免于对已经有序的序列排序. int flag = 0; // 获取序列元素个数. auto length = data.size(); if(length < 2) { return; } // 开始遍历查找无序区最大值. for(unsigned long i = 0; i < length; i++) { flag = 0; for(unsigned long j = 0; j < length-i-1; j++) { if(data.at(j+1) < data.at(j)) { // 无序区前一个元素大于它的后一个元素,需要交换位置以及设置本轮的监控位. flag = 1; auto temp = data.at(j); data.at(j) = data.at(j+1); data.at(j+1) = temp; } } if(flag == 0) { // 如果监控位为0,则说明无序区已经是有序的了,排序完毕. return; } } }