排序算法实践——快速排序

排序算法

快速排序

自己试一试写写快排,回顾思路,用的递归,没用迭代

//
//  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;
}

输出结果:

posted @ 2020-10-07 20:45  鸵鸟洵  阅读(101)  评论(0)    收藏  举报