//对于长度为N的数组,选择排序大约需要N^2/2次比较和N次排序
//运行时间与输入无关(其他算法更善于利用输入的初始状态)
//数据的移动是最少的(交换次数和数组大小是线性关系)
void select_sort(vector<int>& nums) {
int len = nums.size();
for (int i = 0; i < len - 1; ++i) {
int min = i;
for (int j = i + 1; j < len; ++j) {
if (nums[j] < nums[min]) j = min;
}
swap(nums[i],nums[min]);
}
}
//对于随机排列的长度为N且主键不重复的数组
//平均情况下插入排序需要~N^2/4(最坏~N^2/2,最好N-1)次比较
//和~N^2/4次交换(最坏~N^2/2,最好0)
//插入排序的交换次数与数组中逆序数相同
//需要比较的次数不小于倒置的数量不大于倒置的数量加上数组的大小再减一
void insert_sort(vector<int>& nums) {
int len = nums.size();
for (int i = 0; i < len - 1; ++i) {
for (int j = i + 1; j > 0 && nums[j] < nums[j - 1]; --j) {
swap(nums[j], nums[j - 1]);
}
}
}
//对于随机排序的无重复主键的数组,插入排序与选择排序的运行时间是平方级别的
//且两者之比是一个较小的常数
//希尔排序高效性的原因是它权衡了子数组的规模和有序性
//排序前,子数组很短,排序后子数组部分有序————两种情况都适合插入排序
//相较选择和插入排序,更适合大数组,数组越大,优势越大
void shell_sort(vector<int>& nums) {
int len = nums.size();
int h = 1;
while (h < len) h = h * 3 + 1; //递增序列:1,4,13...
//使用递增序列1,4,13..的希尔排序比较次数不会超过N的若干次数乘以递增序列的长度
while (h) {
for (int i = h; i < len; ++i) {
for (int j = i; j >= h && nums[j] < nums[j - h]; j -= h) {
swap(nums[j], nums[j - h]);
}
}
h /= 3;
}
}
【算法第四版读书笔记】初级排序算法
最新推荐文章于 2024-08-10 10:17:47 发布
本文深入探讨了三种经典的排序算法:选择排序、插入排序和希尔排序。选择排序在平均情况下需要大约N^2/2次比较和N次排序,而插入排序在最好情况下只需N-1次比较。希尔排序通过设置增量序列优化了排序过程,尤其适合大数组。三种算法各有优劣,适用于不同的场景。
摘要由CSDN通过智能技术生成