今日: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;
}