1. 程式人生 > >c語言快速排序

c語言快速排序

快速排序是基於分治法的重要排序演算法,按照記錄的值的對序列進行劃分,具體步驟為

1:初始化

取第一個記錄(值)作為基準,設定兩個引數i,j分別用來指示將要與基準記錄進行比較的左側記錄位置和右側記錄位置,也就是本次劃分的區間(第一個值記為i,最後一個值記為j,按照中間位置劃分,一分為2)

2:右側掃描過程

將基準記錄(i值,開始為第一個值)與j指向的記錄進行比較,如果j指向的記錄的值大,則j向左移動一個位置j--,重複右側掃描過程(繼續將i與j--進行比較),直到右側的記錄的值小(j--對應的值比i小),將j對應的值與i對應的值進行交換,進行左側掃描。

3:左側掃描過程

將i指向的記錄與j指向的記錄進行比較,如果i指向的記錄小,則i右移一個位置i++,重複左側掃描過程,直到i指向的記錄大於j指向的記錄,進行交換,在進行右側劃分

4:直到i==j,第一次劃分完成,在遞迴進行右側掃描和左側掃描

初始狀態:     46  30  82  90  56  17  95  15        選擇46 作為基準值,i = 0, j = 7

       i = 0                        j = 7

         15  30  82  90  56  17  95  46       15 < 46, 交換 15 和 46,移動 i, i = 1

         i = 1                        j = 7

        15  30  82  90  56  17  95  46       30 < 46, 不需要交換,移動 i , i = 2

            i = 2                   j = 7

         15  30  46  90  56  17  95  82       82 > 46, 交換82 和 46,移動 j , j = 6

            i = 2               j = 6

        15  30  46  90  56  17  95  82       95 > 46, 不需要交換,移動 j , j = 5

            i = 2         j = 5

        15  30  17  90  56  46  95  82       17 < 46, 交換46 和 17,移動 i, i = 3

             i = 3    j = 5

        15  30  17  46  56  90  95  82       90 > 46, 交換90 和 46,移動 j , j = 4

            i = 3    j = 4

        15  30  17  46  56  90  95  82       56 > 46, 不需要交換,移動 j , j = 3

            i  =  j = 3
第一次劃分完成
[15 30 17] 56 [90 95 92]
在將左側的進行上述步驟,右側的進行上述步驟
15 17 30 56 90 92 95
完成快速排序
int Partation(int r[],int first,int end)//一次劃分的函式
{
    int i=first,j=end;
    while(i<j)//i==j作為一次劃分結束的條件
    {
        while(r[i]<r[j]) j--;//右側側掃描,滿足條件,一直進行右側側掃描
        if(i<j)//不滿足條件則進行交換,且i右移,進行左側掃描
        {
            r[i]=r[j];
            r[j]=r[i];
            i++;
        }
        while(r[i]<r[j]) i++;//滿足條件則進行左側掃描
        if(i<j)//不滿足則交換位置,j左移,進行右側掃描
        {
            r[i]=r[j];
            r[j]=r[i];
            j--;
        }
    }
    return i;//記錄中心軸的最終位置
}
void QuickSort(int r[],int first,int end)
{
    int p;
    if(first<end){//first=end為遞迴跳出的條件
    p=Partation(r,first,end);//p為中間位置
    QuickSort(r,first,p-1);//遞迴進行左側掃描,右側掃描
    QuickSort(r,p+1,end);
}