希尔排序
希尔排序就是多层次的直接插入排序。用来把较小的元素先扔到队列前面,减少后续的排序复杂度,读懂了希尔排序就是读懂了直接排序
#include <iostream>
#include <vector>
using namespace std;
void shell_sort(std::vector<int> &nums)
{
int n = nums.size();
for(int gap = n/2;gap>=1;gap =(gap/2))//定义排序分组的长度,以1/2缩小,gap=1时为直接排序
{
for(int start = 0;start < gap;start++)//start:每一个排序组的首位索引
{
for(int i = (start + gap);i < n;i+=gap)//i是目前要进行排序的目标数
{
for(int j = (i-gap); j>=start;j-=gap)//j是已经排列好的数字部分中的数索引,当目标数比它小的时候,就要交换两个数,把它丢到前面去
{
if(nums[j] > nums[j+gap])
swap(nums[j],nums[j+gap]);
else
break;
}
}
}
}
}
int main() {
vector<int> nums{{2,343,21,43,64,67,321,354,32,332,4,456}};
shell_sort(nums);
for(auto ele:nums)
{
cout<<ele<<" ";
}
return 0;
}
选择排序
void SelectSort(int* a,size_t n)
{
assert(a);
int begin = 0;
int end = n-1;
while ( begin < end )
{
int min = begin,max = begin;
for(int i = begin; i <= end; ++i)
{
if( a[min] > a[i] )
min = i;
if( a[max] < a[i] )
max = i;
}
swap( a[min],a[begin] );
if( max == begin )//如果首元素是最大的,则需要先把min 和 max的位置一换,再交换,否则经过两次交换,又回到原来的位置
max = min;
swap( a[max],a[end] );
begin++;
end--;
}
}
版权声明:本文为CSDN博主「YAIMZA」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37941471/article/details/80710099