代码说明
代码是我亲自码的,调试通过的,代码中有算法思想和详细的注释,一目了然。
项目已经上传到我的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_insert(std::vector<int>& data)
{
// 思想:
// 在原始待排序列上做修改;
// 将待排序序列分为有序区和无序区;
// 最开始的待排序列只有第一个元素是有序的;
// 从第二个元素开始,向有序区往前查找合适的位置插入;
// 直到最后一个元素找到了合适的位置插入时原待排序列变为有序序列.
// 获取待排序列的长度,长度小于2则序列肯定为有序的.
auto length = data.size();
if(length < 2)
{
return;
}
// 从序列中第二个元素开始遍历
for(unsigned long i = 1; i < length; i++)
{
// 本轮要插入的元素.
int key = data.at(i);
// k从最后一个有序元素(i前一个)往前遍历查找插入位置.
// 此处k的类型不能是unsigned long,因为k可能会等于-1,
// 如何为unsigned long的话会出现out of range 的错误.
int k = i - 1;
while(k >= 0 && data.at(k) > key)
{
// 将大于key的元素往后移,给key腾出位置插入.
data.at(k+1) = data.at(k);
k--;
}
// 已经找到要插入的位置为k+1,将key插入.
data.at(k+1) = key;
}
}