排序演算法實踐——快速排序
阿新 • • 發佈:2020-10-07
排序演算法
快速排序
自己試一試寫寫快排,回顧思路,用的遞迴,沒用迭代
// // 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; }