排序算法
快速排序
#自己试一试写写快排,回顾思路,用的递归,没用迭代
//
// main.cpp
// QucikSort
//
// Created by 陈洵 on 2020/10/7.
//
#include <iostream>
#include <vector>
using namespace std;
//代码不简洁,但写一遍思路还是比较清晰了
void quciksort(vector<int>& nums,int left,int right){
int i = left, j = right;
int standard = nums[left];//基准值
int state = 0;//state记录此时是从左扫还是从右扫
if(i == j) return;
while(i!=j){
//state=0从右往左扫找第一个比基准值小的点
if(state == 0){
while(nums[j] > standard && i < j){
j--;
}
//没找到这样的点,退出循环
if(i==j) break;
//找到了这样的点,交换位置并更改扫描方向state
nums[i] = nums[j];
i++;
state = 1;
}
//state=1从右往左扫找第一个比基准值小的点
if(state == 1){
while (nums[i] < standard && i < j) {
i++;
}
//没找到这样的点,退出循环
if(i==j) break;
//找到了这样的点,交换位置并更改扫描方向state
nums[j] = nums[i];
j--;
state = 0;
}
}
//将基准值放在本轮递归的基准点(i==j)上
nums[i] = standard;
//在基准点左边递归快排(左边只有一个元素的时候不用排了)
if(i-left>1)
quciksort(nums, left, i-1);
//在基准点右边递归快排(右边只有一个元素的时候也不用排了)
if(right-i>1)
quciksort(nums, i+1, right);
return;
}
int main(int argc, const char * argv[]) {
vector<int> vec;
int temp=0;
cout << "输入整数,以任意字母结束:" << endl;
while(cin >> temp) //如果不确定输入数du字个数,可以用这种方式
{
vec.push_back(temp); //填充数据
}
int count = (int)vec.size();
cout << "共有"<<count<<"个元素"<<endl;
cout<<"排序前顺序:";
for (int i=0;i<count;i++)
{
cout << vec[i]<<",";
}
quciksort(vec, 0, count-1);
cout<<endl;
cout<<"排序后顺序:";
for (int i=0;i<count;i++)
{
cout << vec[i]<<",";
}
cout << endl;
return 0;
}
##输出结果: