希尔排序
核心思想:将数据分组,例12个数的数组,先分6组再分3组再分1组,这样越往后数组越趋于有序。
例:
每一次排序之后,数组都比上一次更加有序,相对应的交换次数也会减少。
int shell_sort(vector<int>& arr){
int gap = 0;
int length = arr.size();
for(gap = length / 2;gap > 0; gap /= 2){//分多少组
for(int i = gap;i < length; ++i){//遍历每一组数据
for(int j = i - gap;j > 0 && arr[j] > arr[i] ; j = j - gap){//组内排序
swap(arr[i],arr[i]);
}
}
}
return 0;
}
int main(){
vector<int> arr = {23,12,14,89,30,45,67,20};
shell_sort(arr);
for(int i = 0;i < arr.size();++i){
cout << arr[i] << " ";
}
cout << endl;
}
快速排序
核心思想:每一轮取最左的值为一个哨兵,从右往左找到第一个比他小的值,进行覆盖,再从左到右,寻找到第一个比他大的值进行覆盖,最后哨兵归位,此时哨兵的位置是固定的,左边都比他小,右边都比他大。
例: 12 13 14 3 43 56 19 哨兵temp = 12
l r
r--;直到满足arr[r] < temp,此时找到的数是3
12 13 14 3 43 56 19
l r
交换
3 13 14 12 43 56 19
l r
在l++,直到arr[l] > temp,交换
3 13 14 12 43 56 19
l r
3 12 14 13 43 56 19
l r
终止条件就是i == j此时位置就是哨兵temp的位置
int sort(vector<int>& nums,int left,int right){
if(left >= right) return 0;
int temp = nums[left];
int i = left,j = right;
while(i < j){
while(nums[j] > temp){
j--;
}
nums[i] = nums[j];
while(nums[i] < temp){
i++;
}
nums[j] = nums[i]
}
nums[i] = temp;
sort(nums,left,i - 1);
sort(nums,i + 1,right);
}
int quick_sort(vector<int>& nums){
int left = 0;
int right = nums.size() - 1;
sort(nums,left,right);
}
int main(){
vector<int> nums = {16,9,23,12,89,65,73,24,34,53};
quick_sort(nums);
for(int i = 0;i < nums.size(); ++i){
cout << nums[i] << " ";
}
cout << endl;
}