从零开始的算法小白,快排,c++实现

《数据结构与算法之美》

今日:for循环中初始值必须被指定,递归终止条件需注意。

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


//交换两个数
void swap(int &a, int &b) {
	int xuse;
	xuse = a;
	a = b;
	b = xuse;
}

//找出中间点并且确保点前面的都小、后面的都大
int xpartition(vector<int>& nums, int xbegin, int xend) {
	int standard = xend,standardNum=nums[standard];
	//i:慢指针 j:快指针
	int i=xbegin, j = xbegin;
	int xlen = nums.size();
	//循环来调整顺序
	for (; j < xlen - 1;++j) {
		if (nums[j] < standardNum)
			swap(nums[i++], nums[j]);
	}
	//将中间点归位
	swap(nums[i], nums[standard]);
	//返回中间点,方便下一层的快排
	return i;
}



//快排
void xsort(vector<int>& nums, int xbegin,int xend) {
	//终止条件很重要!别再忘了!!
	if(xbegin>=xend)
		return;
	//第一步,抽象来看就是找出中间点(隐含了中间点前都小于中间点、后都大于中间点的要求)
	int xmid =xpartition(nums,xbegin,xend) ;
	//第二部,抽象来看就是继续去对中间点左右两边进行快排
	xsort(nums,xbegin,xmid - 1);
	xsort(nums, xmid + 1, xend);
}


int main() {
	cout << "请输入数组长度" << endl;
	int xlenth;
	cin >> xlenth;
	vector<int> testNums(xlenth);
	for (int i=0; i < xlenth; ++i)
		cin >> testNums[i];
	xsort(testNums, 0, xlenth - 1);
	cout << "-------------------"<<endl;
	for (int& i : testNums)
		cout << i << endl;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值