快速排序即是在一組數據中任取一個數作為基准數,將大於這個數的數放在這個數的右邊,將小於這個數的數放在這個數的左邊,指針 i 和 j 從數組的左右兩端移動,i 從左向右,j 從右向左。假設以數組中間的那個數作為基准數 x ,則 i 先向右移動,直到移動到一個大於 x 的數停下來,然后 j 開始向左移動,直到移動到一個小於 x 的數停下來,此時只要 i 和 j 所在地方的數互換位置即可達成大數在右小數在左的效果。此輪交換過后 i 和 j 繼續重復剛才的指令,直到 i 和 j 相遇,第一輪結束。此時以 x 為分界點,x 左邊的數都小於 x,x 右邊的數都大於 x。再將 x 左邊和右邊分別看做兩組數繼續重復上述步驟,最終即可將所有數都從小到大排序。
代碼如下:
//此行為空白行
1 #include <iostream> 2 3 using namespace std; 4 5 const int N=100000; 6 int q[N]; 7 void quick_sort(int q[],int l,int r) 8 { 9 int i=l-1,j=r+1; 10 int x=q[(l+r)/2]; 11 if(l>=r)return; 12 while(i<j) 13 { 14 do i++;while(q[i]<x); 15 do j--;while(q[j]>x); 16 if(i<j)swap(q[i],q[j]); 17 } 18 quick_sort(q,l,j); 19 quick_sort(q,j+1,r); 20 } 21 int main() 22 { 23 int n; 24 cin>>n; 25 for(int i=0;i<n;i++)cin>>q[i]; 26 quick_sort(q,0,n-1); 27 for(int i=0;i<n;i++)cout<<q[i]<<" "; 28 return 0; 29 }
(剛開始學習算法,代碼運行過沒有問題,但解釋的可能會有不對的地方,歡迎大佬指正!)