快速排序原理及其實現
阿新 • • 發佈:2020-12-06
今天的排序演算法是快速排序,他的平均時間複雜度為O(nlogn)。
快速排序首先需要選擇一個序列的左端與右端(為了遞迴),再選擇一個基準數(我一般是選擇最左邊的數),再從最左選個i往右移動,最右選個j往左移動。i的目的是找到比基準數大的數,j的目的是找到比基準數小的數,但是移動的前提是i必須要小於j(如果不這樣就會出錯,就可能會使ij永遠錯過引發段錯誤,以87659序列為例自己走一遍就知道了)。當ij碰面的時候就是交換的時候,把碰面的這個數與基準數交換,然後對基準數左邊的序列再一次使用快排,右邊同理。
要注意的問題:
因為是遞迴呼叫,所以要設定遞迴出口,遞迴出口就是左端大於右端,因為下次快排會讓左端加一,這樣在只剩下一個數的情況下就會使左端超過右端,就可以return了,這個序列排列完了。
j一定先走,i一定後走。如果i先走的話,那麼等到交換的時候也是i先走,這樣的話i就會走到j指的那個數上邊,這樣再交換就會把大於基準數的數換到基準數之前,但是我們要基準數之前比他小,這樣就錯了。所以一定要j先走。
#include <iostream> using namespace std; //快排會有遞迴過程,而不借助函式實現遞迴很難做到,所以將快排封裝成函式 int a[10000]; void quicksort(int left, int right) { int i,j,temp; if(left>right) return; i=left; j=right; while(i!=j) { if(a[j]>=a[left] && i<j) j--; if(a[i]<=a[left] && i<j) i++; if(i<j) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } temp=a[left]; a[left]=a[i]; a[i]=temp; quicksort(left,i-1); quicksort(j+1,right); } int main() { int n; cout<<"輸入要排序數的數量:"; cin>>n; for(int i=0; i<n; i++) cin>>a[i]; quicksort(0,n-1); cout<<"排序結果:"; for(int i=0; i<n; i++) cout<<a[i]<<ends; //排序開始 }