前兩天看到一個題目,說要使用非遞歸實現快速排序,參考了網上的資料,完整代碼以下:(點擊此處可查看遞歸快速排序)html
/* * @Author: z.c.wang * @Email: iwangzhengchao@gmail.com */ #include<iostream> #include<vector> #include<stack> #include<time.h> using namespace std; // 與遞歸快速排序中的partition函數相同,尋找切分點,同時調整元素位置 int Partiton(vector<int> &array, int low, int high){ // 三數取中,避免取得最大值或者最小值 int mid = low + (high- low)/2; if(array[low] > array[high]) swap(array[low], array[high]); if(array[mid] > array[high]) swap(array[mid], array[high]); if(array[mid] > array[low]) swap(array[mid], array[low]); int pivot = array[low]; // 執行交換 while(low < high){ while(low < high && array[high] >= pivot) high--; swap(array[low], array[high]); while(low < high && array[low] <= pivot) low++; swap(array[low], array[high]); } return low; } // 非遞歸快速排序 void QuickSort(vector<int> &array){ if(array.size() <= 1) return ; stack<int> st; // 用棧保存每個待排序子串的首尾元素下標 int mid = Partiton(array, 0, array.size()-1); if(mid > 1){ st.push(0); st.push(mid-1); } if(mid < array.size()-2){ st.push(mid + 1); st.push(array.size()-1); } while(!st.empty()){ int right = st.top(); st.pop(); int left = st.top(); st.pop(); mid = Partiton(array, left, right); if(left < mid-1){ st.push(left); st.push(mid-1); } if(right > mid+1){ st.push(mid+1); st.push(right); } } } // 生成隨機數組,長度爲num, 其中每一個元素知足 min<= u <= max vector<int> RAND(int min, int max, unsigned int num){ vector<int> res; if(min > max) return res; srand(time(NULL)); for(unsigned int i = 0; i < num; i++){ int u = min + rand()%(max-min+1); res.push_back(u); } return res; } // 判斷數組是否單調非減 ,如果,返回true bool isOrder(vector<int> array){ if(array.size() <= 1) return true; for(int i = 1; i < array.size(); i++){ if(array[i] < array[i-1]) return false; } return true; } // 打印數組array void printArray(vector<int> array){ for(auto &it : array) cout<<it<<" "; cout<<endl; } int main(int argc, char const *argv[]) { vector<int> array = RAND(0, 10, 20); printArray(array); QuickSort(array); if(isOrder(array)) cout<<"isSorted?: YES"<<endl; else cout<<"isSorted?: NO"<<endl; printArray(array); return 0; }
1 4 0 5 0 9 1 2 1 0 2 6 5 8 3 3 1 3 0 7 isSorted?: YES 0 0 0 0 1 1 1 1 2 2 3 3 3 4 5 5 6 7 8 9 [Finished in 1.3s]
快速排序的非遞歸實現ios