1. 程式人生 > >快速排序演算法 C語言實現

快速排序演算法 C語言實現

快速排序演算法(QuickSort)

1.演算法思想

快速排序是一種劃分交換排序,採用了分治策略,通常稱為分治法。

(1)分治法的基本思想

將原問題分解成若干個規模更小但結構與原問題相似的子問題;遞迴地解這些子問題,然後將這些子問題的解組合成原問題的解。

(2)快速排序的基本思想

 設當前待排序的無序區為R[low..high],利用分治法可將快速排序的基本思想描述為:
①分解:

在R[low..high]中任選一個記錄作為基準(Pivot),以此基準將當前無序區劃分為左、右兩個較小的子

區間R[low..pivotpos-1)和R[pivotpos+1..high],並使左邊子區間中所有記錄的關鍵字均小於等於基準記錄

(不妨記為pivot)的關鍵字pivot.key,右邊的子區間中所有記錄的關鍵字均大於等於pivot.key,而基準記錄

pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。

注意:劃分的關鍵是要求出基準記錄所在的位置pivotpos。

       劃分的結果可以簡單地表示為(注意pivot=R[pivotpos]):

     R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys

                  其中low≤pivotpos≤high。

②求解:通過遞迴呼叫快速排序對左、右子區間R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。


③組合:因為當"求解"步驟中的兩個遞迴呼叫結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步

驟無須做什麼,可看作是空操作。 

第一步:找到一個基準數;把小於這個數的數都放到左邊,把大於這個數的數都放到右邊;

第二部:對基準數左邊和右邊的數,重複第一步;

2.快速排序演算法的C語言實現 (1)選取第一個元素作為基準(樞紐元)
/**********快速排序演算法*****************/
void QuickSort(char s[],int low,int high)
{
int i;
int last;       //記錄基準的位置
if(low<high)    //當陣列中的元素個數大於1時,才進行操作
{
last=low;   //選取第一個元素作為基準
//把小於基準元與大於基準元的分開,last記錄它們分開的界限
for(i=low+1;i<=high;i++)
{
if(s[i]<s[low])
swap(s,++last,i);
}

swap(s,last,low);//基準元與界限交換,這樣的話,基準元兩邊就是一邊大於,一邊小於;
QuickSort(s,low,last-1);  //對左區間遞迴排序
QuickSort(s,last+1,high);//對右區間遞迴排序
}
}
/*交換陣列中的兩個元素*/
void swap(char s[],int i,int j)
{
int temp;
temp=s[i];
s[i]=s[j];
s[j]=temp;
}


注意:
     為排序整個檔案,只須呼叫QuickSort(R,0,n-1)即可完成對R[0..n-1]的排序。

(2) 選取第一個元素作為樞紐元,如果輸入是隨機的,那麼這是可以接受的,但是如果輸入是預排序的或是反序的,那麼選取第一個元素作為樞紐元就產生一個劣質的分割,因為所有的元素不是被劃到這一邊就是劃到另一邊。 隨機選取樞紐元是一種安全的做法; 三數中值分割法:使用陣列的左端、右端和中心位置上的三個元素的中值作為樞紐元