1. 程式人生 > 實用技巧 >排序演算法實踐——快速排序

排序演算法實踐——快速排序

排序演算法

快速排序

自己試一試寫寫快排,回顧思路,用的遞迴,沒用迭代

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

輸出結果: