快速排序算法C++實現[評注版]


快速排序算法C++實現[評注版]

經常看到有人在網上發快速排序的算法,通常情況下這些人是在准備找工作,或者看<算法導論>這本書,而在他們發布的代碼通常是差不多的版本,估計也是網上copy一下,自己改改,跑過了就算了,但是通常這樣玩根本沒有太大作用,如果到一家公司,給你一台不能上網的筆記本,20分鍾,你是根本寫不出來快速排序的算法的,當然除了那些死記硬背的兄弟。

說說我寫這篇文章的目的吧,記得有一天我想重新看看<算法導論>,看到快速排序我覺得很簡單,於是按奈不住,想動手寫寫,可是寫完了,在測試有些數據的時候總也過不去,於是我就想在網上找找按照<算法導論>的提示邏輯寫成的快速排序,但是很是失望,網上差不多都是同一個版本,而且不是我想要的,於是有了本文。

為了讓本文自成體系,先看看什么是快速排序,快速排序是一種排序算法。在平均狀況下,排序n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 演算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實作出來,且在大部分真實世界的資料,可以決定設計的選擇,減少所需時間的二次方項之可能性。

 

首先讓我們來看看<算法導論>上面的算法邏輯

QUICKSORT(A, p, r)//快速排序算法

 if (p < r )

{

q = PARTITION(A, p, r)//分成左右兩半,一半不大於A[r], 一半不小於A[r]

QUICKSORT(A, p, q-1)//遞歸左半

QUICKSORT(A, q+1, r) //遞歸右半

}

 

PARTITION(A, p, r)

x = A[r]//選擇最后一個元素作為比較元素

i = p 1//這個慢速移動下標必須設定為比最小下表p1,否則兩個元素的序列比如21無法交換

for j = p to r-1//遍歷每個元素

{

if (A[j] <= x)//比較

{

i = i + 1//移動慢速下標

Exchange A[i] with A[j ]//交換

}

}

Exchange A[i+1] with A[r]//交換

 

return i + 1//返回分割點

 

 

一次完整的比較過程如下圖:

 

算法導論快速排序邏輯C++實現

//Data swop function

void Swap(int &p,int &q)                          

{                                                      

     int temp = p;

       p=q;

       q=temp;

 

//Partition function

int Partition(int ArrayInput[],int nLow,int nHigh)                

{                                                 

                                                                           

    int nTemp=ArrayInput[nHigh];   

    int i = nLow-1, j=nLow;  

       for(; j<nHigh; j++)

       {

              if( ArrayInput[j]<=nTemp )

              {

                     i++;

                     if(i !=j )

                     {

                           Swap(ArrayInput[i], ArrayInput[j]);

                     }

              }

       }

      

       Swap(ArrayInput[i+1],ArrayInput[nHigh]);

 

    return (i+1);                                        

}

 

//Quick sort

void Quick_sort(int ArrayInput[],int nLow,int nHigh)            

{                                                                                                       

    if(nLow < nHigh)                                        

    {                                                

        int nIndex=Partition(ArrayInput , nLow, nHigh);                         

        Quick_sort(ArrayInput , nLow, nIndex-1);                           

        Quick_sort(ArrayInput , nIndex+1, nHigh);                           

    }                                                 

}

 

總結

本文對<算法導論>的快速排序算法實現的關鍵點進行了詳細的闡述,另外,本文給出了嚴格按照,<算法導論>快速排序算法邏輯實現的C++快速排序算法,希望對大家有所幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM