1. 程式人生 > 其它 >快排非遞迴演算法

快排非遞迴演算法

#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
int getP(int num[],int left,int right){
    int temp=num[left];
    while(left<right){
        while(left<right&&num[right]>=temp){
            right--;
        }
        num[left]=num[right];
        while(left<right&&num[left]<=temp){
            left
++; } num[right]=num[left]; } num[left]=temp; return left; } void quicksort(int num[],int left,int right){ if(left<right){ int pivot=getP(num,left,right); /** 遞迴實現 quicksort(num,left,pivot-1); quicksort(num,pivot+1,right); */ stack<int> st; st.push(left); st.push(right);
while(!st.empty()){ int p=st.top(); st.pop(); int q=st.top(); st.pop(); pivot=getP(num,q,p); if(q<pivot-1){ st.push(left); st.push(pivot-1); } if(p>pivot+1){ st.push(pivot+1); st.push(right); } } } }
int main(){ int num[maxn]; int n; cin>>n; for(int i=0;i<n;i++){ cin>>num[i]; } quicksort(num,0,n-1); for(int i=0;i<n;i++){ cout<<num[i]<<" "; } cout<<endl; }

原理:

利用棧迴圈儲存子區間的邊界,然後彈出邊界找中樞pivot