1. 程式人生 > 實用技巧 >快速排序原理及其實現

快速排序原理及其實現

今天的排序演算法是快速排序,他的平均時間複雜度為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; //排序開始 }