排序算法:希尔排序 快速排序

希尔排序

核心思想:将数据分组,例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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值