代码说明
代码是我亲自码的,调试通过的,代码中有算法思想和详细的注释,一目了然。
项目已经上传到我的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;
}
}
}