快速排序–C語言

來源:互聯網
上載者:User

快速排序是對冒泡排序的一種改進。它的基本思想是:通過一躺排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一不部分的所有資料都要小,然後再按次方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

   假設要排序的數組是A[1]……A[N],首先任意選取一個資料(通常選用第一個資料)作為關鍵資料,然後將所有比它的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一躺快速排序。一躺快速排序的演算法是:

  1)、設定兩個變數I、J,排序開始的時候I:=1,J:=N;

  2)以第一個數組元素作為關鍵資料,賦值給X,即X:=A[1];

  3)、從J開始向前搜尋,即由後開始向前搜尋(J:=J-1),找到第一個小於X的值,兩者交換;

  4)、從I開始向後搜尋,即由前開始向後搜尋(I:=I+1),找到第一個大於X的值,兩者交換;

  5)、重複第3、4步,直到I=J;

  例如:待排序的數組A的值分別是:(初始關鍵資料X:=49)

                  A[1]    A[2]    A[3]    A[4]    A[5]     A[6]    A[7]: 

                    49       38      65      97      76      13       27

進行第一次交換後:  27       38      65      97      76      13       49

                  ( 按照演算法的第三步從後面開始找

進行第二次交換後:  27       38      49      97      76      13       65

                 ( 按照演算法的第四步從前面開始找>X的值,65>49,兩者交換,此時I:=3 )

進行第三次交換後:  27       38      13      97      76      49       65

( 按照演算法的第五步將又一次執行演算法的第三步從後開始找

進行第四次交換後:  27       38      13      49      76      97       65

( 按照演算法的第四步從前面開始找大於X的值,97>49,兩者交換,此時J:=4 )

     此時再執行第三不的時候就發現I=J,從而結束一躺快速排序,那麼經過一躺快速排序之後的結果是:27       38      13      49      76      97       65,即所以大於49的數全部在49的後面,所以小於49的數全部在49的前面。

     快速排序就是遞迴調用此過程——在以49為中點分割這個資料序列,分別對前面一部分和後面一部分進行類似的快速排序,從而完成全部資料序列的快速排序,最後把此資料序列變成一個有序的序列,根據這種思想對於上述數組A的快速排序的全過程6所示:

 

 初始狀態                       {49    38    65    97    76    13    27}   

進行一次快速排序之後劃分為     {27    38    13}    49  {76    97    65}

分別對前後兩部分進行快速排序 {13}   27   {38} 

                                                          結束        結束   49   {65}   76   {97}

#include "stdafx.h"#include"stdio.h"void main(){    void quickSort(int [],int,int);    int a[7]={8,2,6,12,1,9,5};    int i;    quickSort(a,0,6);/*排好序的結果*/    for(i=0;i<7;i++)        printf("%4d",a[i]);}void quickSort(int a[],int left,int right){   int i,j,temp;   i=left;   j=right;   temp=a[left];   if(left>right)      return;   while(i<j)/*找到最終位置*/   {      while(a[j]>=temp && j>i)         j--;      if(j>i)         a[i++]=a[j];      while(a[i]<=temp && j>i)          i++;      if(j>i)          a[j--]=a[i];   }   a[i]=temp;   quickSort(a,left,i-1);/*遞迴左邊*/   quickSort(a,i+1,right);/*遞迴右邊*/}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.