快速排序算法的两种实现

快速排序(Quicksort)是对冒泡排序的一种改进。

快速排序由C. A. R. Hoare在1962年提出。

它的基本思想是:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

方法一:

#include <iostream>
#include <vector>

using namespace std;

void quicksort(vector<int>&nums,int low,int high){
    if(low>=high) return;
    int first=low;
    int last=high;
    int key=nums[first];    //取数组第一个元素为基准元素
    while(first<last){
        while(first<last&&nums[last]>=key) last--;  //让last从后向前进行查询,直到找到第一个小于key的元素
        nums[first]=nums[last];         //把首指针数组用尾指针数组替换
        while(first<last&&nums[first]<=key) first++;    //让first从前向后进行查询,直到找到第一个大于key的元素
        nums[last]=nums[first];         //把尾指针数组用首指针数组替换
    }
    nums[first]=key;    //基准元素归位
    quicksort(nums,low,first-1);    //递归调用对基准左边的数组排序
    quicksort(nums,first+1,high);   //递归调用对基准右边的数组排序
}

int main(){
    int n,temp;
    cin>>n;
    vector<int>nums;
    while(n--){
        cin>>temp;
        nums.push_back(temp);
    }
    quicksort(nums,0,nums.size()-1);
    for(int i=0;i<nums.size();i++){
        cout<<nums[i]<<" ";
    }
    cout<<endl;
    return 0;
}

方法二:


#include <iostream>
#include <vector>

using namespace std;

void quicksort(vector<int>&nums,int low,int high){
    if(low>=high) return;
    int first=low;
    int last=high;
    int key=nums[first];    //取数组第一个元素为基准元素
    while(first<last){
        while(first<last&&nums[last]>=key) last--;  //让last从后向前进行查询,直到找到第一个小于key的元素
        swap(nums[first],nums[last]);       //交换首尾指针指向的数组
        while(first<last&&nums[first]<=key) first++;    //让first从前向后进行查询,直到找到第一个大于key的元素
        swap(nums[first],nums[last]);       //交换首尾指针指向的数组
    }
    quicksort(nums,low,first-1);    //递归调用对基准左边的数组排序
    quicksort(nums,first+1,high);   //递归调用对基准右边的数组排序
}

int main(){
    int n,temp;
    cin>>n;
    vector<int>nums;
    while(n--){
        cin>>temp;
        nums.push_back(temp);
    }
    quicksort(nums,0,nums.size()-1);
    for(int i=0;i<nums.size();i++){
        cout<<nums[i]<<" ";
    }
    cout<<endl;
    return 0;
}

区别:
这两种实现方法的微小区别在于,前者需要基准元素归位,而后者不用;前者通过首尾指针相互替换交换,而后者直接交换。
注意:
动态数组参数需要加引用,否则不会改变;while循环中判断条件要带上等号,不然数字重复会死循环;如果要举例,随便自己找几个数在纸上按步骤一步一步画一下就出来了;其实基准元素可以任意,为了方便取第一个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值