代码说明
代码是我亲自码的,调试通过的,代码中有算法思想和详细的注释,一目了然。
项目已经上传到我的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_select(std::vector<int>& data)
{ // 首先找出待排序列中最小的数,然后用这个数和原序列中的第一个数交换位置;
// 其次,找出第二小的和原第二个数交换位置;
// 依次顺序直到找到第二大的数,之后原数列完全变成有序数列.
//获取待排序列的长度
auto length = data.size();
//开始选择
for(unsigned long i = 0; i < length - 1; i++)
{
// 找到无序序列中最小的数的下标.
unsigned long min = i;
for(unsigned long j = i + 1; j < length; j++)
{
if(data.at(min) > data.at(j))
{
min = j;
}
}
// 此时的min是无序序列中最小值的下标,将其放入有序序列区.
auto temp = data.at(i);
data.at(i) = data.at(min);
data.at(min) = temp;
}
}