c++实现快速排序

一、基本原理

基本原理就是分治和递归,参考博客:点击访问

二、c++代码实现

写法一

#include<iostream>
#include<vector>

using namespace std;

class QuickSort
{
private:
	// 找到一个位置,这个位置的左边都小于基准,右边都大于基准
	int partition(vector<int>& nums, const int low, const int high);

public:
	bool quickSort(vector<int>& nums, const int low, const int high)
	{
		if (low < high)
		{
			int pivot = this->partition(nums, low, high);
			cout << "pivot = " << pivot << endl;
			quickSort(nums, low, pivot - 1);
			quickSort(nums, pivot + 1, high);
		}
		return true;
	}
};



int main()
{
	QuickSort q;
	vector<int> nums{ 2,20,2,8,7,11,1,3,3,5,1,4,6,6,6,6 };
	q.quickSort(nums, 0, nums.size() - 1);

	return 0;
}

int QuickSort::partition(vector<int>& nums, const int low, const int high)
{
	int baseNum = nums[low];
	
	int i = low, j = high;
	while (i < j)
	{
		// 从右边找第1个小于baseNum的数
		while (i < j)
		{
			if (nums[j] <= baseNum) break;
			else j -= 1;
		}
		// 替换掉l所在位置的值
		nums[i] = nums[j];

		//从左边找第一个大于baseNum的数
		while (i < j)
		{			
			if (nums[i] > baseNum) break;
			else i += 1;
		}
		// 替换掉r所在位置的值
		nums[j] = nums[i];
		//cout << "i=" << i << ", j=" << j << endl;
	}

	// 将重合的位置设置baseNum
	nums[i] = baseNum;

	for (const auto& item : nums)
	{
		cout << item << " ";
	}
	cout << endl;

	return i;
}

写法二

#include<vector>
#include<iostream>
using namespace std;


void quickSort(vector<int>& nums, const int st, const int ed)
{
    if(st<ed)
    {
        int left = st, right = ed;
        int pivot = nums[left];               
        while(left < right)
        {   
            while(left<right)
            {
                // 从右边找小于pivot的值
                if(nums[right]<pivot)
                {
                    // 将left处的值置为小值
                    nums[left] = nums[right];
                    break;
                } 
                else right-=1;
            }
            

            while(left<right)
            {
                // 从左边找大于pivot的值
                if(nums[left]>pivot)
                {
                    nums[right] = nums[left];
                    break;
                }
                else left +=1;
            }
        }
        //
        if(left!=right)
        {
            cout<<"[ERROR]: left="<<left<<", right="<<right<<endl;
            return;
        }
        nums[left] = pivot;

        //
        quickSort(nums, st, left-1); // 注意这里是st,不是0
        quickSort(nums, left+1, ed); // 注意这里是ed,不是nums.size()-1
    }
}


int main()
{
    vector<int> nums{10,3,7,2,1,2,5,8,6,7};
    quickSort(nums, 0, nums.size()-1);
    for(const int num : nums) cout<<num<<" ";
    cout<<endl;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值