快速排序C++實現(遞迴,非遞迴)
阿新 • • 發佈:2019-02-09
#include <iostream> #include <vector> #include <stack> using namespace std; int quickSortRecusive(vector<int>& data,int i,int j) { int l = i; int r = j; int x = data[r]; //基準 if(l >= r) return l; while(l < r){ while(l < r && data[l] < x){ l++; } if(l < r){ data[r] = data[l]; r--; } while(l < r && data[r] > x){ r--; } if(l < r){ data[l] = data[r]; l++; } } data[l] = x; quickSortRecusive(data,i,l-1); quickSortRecusive(data,l+1,j); } int partition(vector<int>& data,int l,int r) { int x = data[r]; //基準 if(l >= r) return l; while(l < r){ while(l < r && data[l] < x){ l++; } if(l < r){ data[r] = data[l]; r--; } while(l < r && data[r] > x){ r--; } if(l < r){ data[l] = data[r]; l++; } } data[l] = x; return l; } void print(vector<int>& data) { for(auto &c : data) cout << c << " "; cout << endl; } //非遞迴實現 int quickSortNorecusive(vector<int>& data,int l,int r) { stack<int> st; if(l < r) { int tmp = partition(data,l,r); if(tmp-1 > l) //左邊不止一個元素 { st.push(tmp-1); st.push(l); } if(tmp+1 < r) { st.push(r); st.push(tmp+1); } while(!st.empty()){ int start = st.top(); st.pop(); int end = st.top(); st.pop(); int tmp = partition(data,start,end); if(tmp-1 > start) //左邊不止一個元素 { st.push(tmp-1); st.push(start); } if(tmp+1 < end) { st.push(end); st.push(tmp+1); } } } } int main(void) { vector<int> data={1,7,5,333,1,35,1245,2,68,32}; //quickSortRecusive(data,0,data.size()-1); quickSortNorecusive(data,0,data.size()-1); print(data); }