快速排序算法的主要思想是分段與遞歸。
分段:取出一個元素,將它放到一個特定位置,是的左邊的數全小,右邊的數全大
遞歸:對左邊的數執行該算法,對右邊的數執行該算法。
那麼,分段過程中,如何找到這樣一個特定的分段位置呢?來看一下算法在遞歸前的運行過程。
假設有一個數組,其中7個數如下圖所示,需要進行快排。
我們需要i,j 做兩個下標,指向數組兩頭,還有一個臨時變量temp,用來當臨時的容器。
首先,取出第一個數放到數組外面,存到temp變量裏最後用,於是5的位置相當於騰空了(藍色標識)。
第二步:j方向依次找比5小的數,很巧,3就是,於是3放到原先5的位置,i下標+1;
第三步:從i方向開始找比5大的數,4,1,2都比5小,於是i連續移動到了6的位置,將6放入原先3的位置(黃色標識),j下標-1。
第四步:從j方向找比5小的數,j–,直到與i重合,也沒再發現比5小的數,此時ij都在6上
最後,把最開始放在臨時容器的5放到此時ij重合的位置,這個位置就是之前說的分解位置,再用一個變量k記住這個位置。
剩下的事就是遞歸了,左邊做一次,右邊再做一次,算法完成。
快速排序的代碼不算太長,C語言版本的算法代碼如下:
void QuickSort(int *array,low,high)
{
if(low>=high)return;
int i,j; //記錄數組高低邊界
int temp; //存儲臨時取出的數
int k; //記錄分解數組下標
i=low;
j=high;
temp=array[i]; //先存下數組第一個數
while(i<j)
{
while(array[j]>temp && i<j)
{
j--; //連續移動j下標,直到找到右邊比temp小的數
}
if(i<j)
{
array[i]=array[j];
i++;
}
while(array[i]<temp && i<j)
{
i++; //連續移動數組i下標,直到直到左側比temp大的數
}
if(i<j)
{
array[j]=array[i];
j--;
}
}
//出了這個while循環,表明i=j
array[i]=temp;
k=i;
QuickSort(array,low,k-1);
QuickSort(array,k+1,high);
}