數據結構C語言實現----快速排序


 快速排序算法

下文中提到的“指針”並不是C語言語法上的指針!

下文中提到的“指針”並不是C語言語法上的指針!

下文中提到的“指針”並不是C語言語法上的指針!

  首先看下面這個例子:

  

 

   我們取第一個元素為基准元素:

  

 

   之后,從右邊開始與基准元素挨個比較,如果比基准元素大,右指針往左移,如果比基准元素小,就與左指針指的元素交換(因為左指針永遠停留在一個

  空白的值上,不用擔心值被覆蓋)

 

  4的值比5小,所以左右指針的值交換,右指針就變成空的了:

  

 

   一旦完成交換操作,另一個指針就要開始移動了!

  (交換完成后,左指針要立刻右移一下,因為接下來判斷左指針是否右移的條件是元素與基准的比較,交換完成后左指針指向的元素交換前已經比較過了)

 

  左指針開始右移,指向的元素與基准元素比較,比基准小左指針繼續右移,比基准元素大,就與右指針交換

  4比5小,左指針右移:

  

 

   9比5大,與右指針交換:

  

 

  一旦完成交換操作,另一個指針就要開始移動了!

  (交換完成后,右指針要立刻左移一下,因為接下來判斷右指針是否左移的條件是元素與基准的比較,交換完成后右指針指向的元素交換前已經比較過了)

  右指針開始左移,第一個元素小於基准

  左右指針的值交換:

  

 

   交換完成左指針應該立刻右移一位:

  

 

   左指針開始右移

  第一個元素0,小於基准,繼續右移

  下一個元素4也小於基准,繼續右移

  來到元素7,大於基准,指針的值交換:

  

 

 

   交換完成后,右指針立刻左移一位:

  

 

   元素8大於基准,所以右指針繼續左移:

  

 

   元素4小於基准,交換值:

  

 

   交換完成,左指針立刻右移一下:

  

 

   此時左右指針重合,重合位置放入基准元素:

  

 

   讓后基准元素左面都比他小,右面都比他大,左右兩個子列再套用上述方法,直至排序結束!

  

 

通過分析上面的例子,我們知道,快速排序大體分這么幾步:

    while(左指針在右指針的左邊)

    {

        while(右指針指向的元素大於基准)

        {

          右指針右移

        }

        //退出了上面這個循環說右指針移動到了一個小於基准的元素下面

        將右指針指向的值賦值給左指針指向的值

        左指針立刻右移一下

 

        while(左指針指向的元素小於基准元素)

        {

          左指針右移一位

        }

        //退出了上面這個循環說明左指針移動到了一個大於基准的元素下面

        將左指針指向的值賦值給右指針指向的值

        右指針立刻左移一下

    }

    最后左右指針會重合,重合的位置賦值為基准元素的值;

    左子列重復快速排序;

    右子列重復快速排序;

 

運行結果:

  

 

 

源碼如下:

 #include<stdio.h>
 typedef int keytype;
 //快速排序
 void quicksort(keytype k[] , int ArrayLeft , int ArrayRight)
 {
     int left = ArrayLeft;
     int right = ArrayRight;
     int temp = k[left];

    if (left < right)
    {
        while (left < right)
        {
            while (left < right && k[right] >= temp)
            {
                right--;
            }
            //if (k[right] < temp)
            {
                k[left] = k[right];
                left++;
            }
            
            while(left < right && k[left] <= temp)
            {
                left++;
            }
            //if (k[left] > temp)
            {
                k[right] = k[left];
                right--;
            }
        }
        k[left] = temp;
        quicksort(k,ArrayLeft,left-1);
        quicksort(k,right+1,ArrayRight);
    }
 }
 #define MAX 100
int main()
{
    //讀取一串數字
    printf("請輸入一串無序數字:");
    int c;
    int n = 1;
    keytype k[MAX];
    while ((c = getchar())!='\n')
    {
        k[n++] = c-'0';
    }
    if (c == '\n')
    {
        k[n] = '\0';
    }
    //快速排序
    quicksort(k,1,n-1);
    printf("這串數字從小到大為:");
    for (size_t i = 1; i <= n-1; i++)
    {
        printf("%d",k[i]);
    }
    return 0;
}

  


免責聲明!

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



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