C語言之——快速排序(圖解)


C語言之--快速排序

純屬學習記錄,僅供參考。

 

快速排序

快速排序:

(1)首先規定一個“基准”, 將數據分為兩個部分。

(2)將大於等於(大於)的數據放在基准的右面,將小於(小於等於)的數據放在基准的左面。

(3)然后,左面的數據又可以規定一個基准,分為兩部分;右面的數據也可以規定一個基准,也分為兩部分。遞歸下去。

(4)直到分到不可再分,或數據有序。

如果右面找到一個小於基准的數,左面找到一個小於基准的數,而且左右沒有相遇則交換左右數據。

如果左右相遇了,那么就把基准與相遇點數據交換。

自此,將序列分為左右兩部分。左面的小於基准,右面的大於基准。

 

代碼示例:

#include <stdio.h>
#include <string.h>

void QuickSort(char arry[], int L, int R);
  
void main(void)
{
     int i;
     char arry[8] = {5, 4, 9, 8, 7, 6, 2, 1};
     printf("原來順序:\n");
     for (i = 0; i < sizeof (arry); i++)
     {
        printf("%d\t", arry[i]);
     }
     printf("\n");
     QuickSort(arry, 0, 7);
     printf("排序后:\n");
     for (i = 0; i < sizeof (arry); i++)
     {
        printf("%d\t", arry[i]);
     }
     printf("\n");
     return;
}

void QuickSort(char arry[], int L, int R)
{
     int left = L,right = R;
     int x;
     int Centor = 0,temp = 0;
     
      if (L > R)
     {
         return;
     }
     Centor = arry[L];//基准保存在Centor中
     while (left != right)//left 與 right 沒有相遇 則繼續循環交換
     {
         while (arry[right] >= Centor && left < right)//如果右面的數大於基准跳過,小於基准停止,
         {
             right--;
         }
         while (arry[left] <= Centor && left < right)//如果左面的數小於基准跳過,大於基准停止,
         {
             left++;
         }
         if (left < right)//如果left 與 right 沒有相遇,則將 右面小於基准的數 與 左面大於基准的數交換
         {
             temp = arry[left];
             arry[left] = arry[right];
             arry[right] = temp;
         }
         //顯示交換后的序列
         for (x = 0; x < 8; x++)
         {
            printf("%d\t", arry[x]);
         }
         printf("\n");
     }
     //如果left 與 right 相遇 則將基准以相遇的位置數據互換,至此 就將數據分為了左右兩部分
     //左面的小於基准,右面的大於基准
     arry[L] = arry[left];
     arry[left] = Centor;
     //將左面的繼續進行排序
     QuickSort(arry, L, left-1);
     //將右面的繼續進行排序
     QuickSort(arry, right+1, R);
}

 

輸出結果:

原來順序:
5       4       9       8       7       6       2       1
5       4       1       8       7       6       2       9
5       4       1       2       7       6       8       9
5       4       1       2       7       6       8       9
2       1       4       5       7       6       8       9
2       1       4       5       7       6       8       9
1       2       4       5       7       6       8       9
1       2       4       5       6       7       8       9
排序后:
1       2       4       5       6       7       8       9

 


免責聲明!

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



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