• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-80  評論-24  文章-0  trackbacks-0
            今天寫一下快排,最經(jīng)典的排序算法:

             1 int partition(int *a, int low, int high)
             2 {
             3     int pivot = a[low]; //設(shè)定a[low]為樞軸
             4     int i = low, j = high + 1;
             5 
             6     while (1)
             7     {
             8         do { //從右向左找到一個比pivot小的數(shù)
             9             --j;
            10         } while (i < j && a[j] >= pivot);
            11 
            12         do { //從左向右找到一個比pivot大的數(shù)
            13             ++i;
            14         } while (i < j && a[i] <= pivot);
            15 
            16         if (i < j)
            17         { //把這兩個數(shù)交換
            18             a[i] = a[i] ^ a[j];
            19             a[j] = a[i] ^ a[j];
            20             a[i] = a[i] ^ a[j];
            21         }
            22         else //說明a[i]左邊的數(shù)字全部比pivot小,而a[j]右邊的數(shù)字全部比pivot大,則說明找到了pivot應(yīng)該在的位置,跳出循環(huán)
            23         {
            24             break;
            25         }
            26     }
            27 
            28     if (i > j)
            29     {
            30         --i;
            31     }
            32 
            33     a[low] = a[low] ^ a[i];
            34     a[i] = a[low] ^ a[i];
            35     a[low] = a[low] ^ a[i];
            36     return i; //返回pivot的位置
            37 }
            38 
            39 void Qsort(int *a, int low, int high)
            40 {
            41     if (low < high)
            42     {
            43         int mid = partition(a, low, high);
            44         Qsort(a, low, mid - 1);
            45         Qsort(a, mid + 1, high);
            46     }
            47 }
            48 

            其中,還是要屬partition為核心,關(guān)鍵就看怎么分。一種典型的效果比較好的分法就是:
            1、選定某個元素為pivot(假定選a[low]),則設(shè)i = low, j = high + 1;
            2、對數(shù)組從j開始自右向左掃描,找到第一個比pivot小的數(shù),假定為a[j];然后從i開始自左向右掃描,找到第一個比pivot大的數(shù),假定為a[i];
            3、若i < j,則將a[i]與a[j]交換位置,重復(fù)步驟2;否則執(zhí)行步驟4;
            4、仔細(xì)觀察執(zhí)行步驟不難發(fā)現(xiàn),極端情況下i會大于j,但是i最大也就只能是j + 1(可以參考下面的說明),因此若i > j,則--i。然后交換pivot與a[i]的值,返回i值。

            極端情況下可能會有以下情況:

            也就是i在j后面一個位置,因此應(yīng)該判斷i是否大于j,如果大于則交換a[--i]與a[low](也就是pivot)的值,然后返回i。
            posted on 2011-04-21 00:50 myjfm 閱讀(268) 評論(0)  編輯 收藏 引用 所屬分類:
            久久一日本道色综合久久| 国产毛片欧美毛片久久久| 中文精品久久久久人妻不卡| 欧美久久一区二区三区| 久久99久久无码毛片一区二区| 久久99精品久久久久久不卡| 精品多毛少妇人妻AV免费久久| 欧美粉嫩小泬久久久久久久| 久久精品国产亚洲AV忘忧草18| 久久久亚洲欧洲日产国码二区 | 99久久精品国产高清一区二区| 97精品国产97久久久久久免费| 情人伊人久久综合亚洲| 久久伊人影视| 久久久久亚洲AV综合波多野结衣| 久久久久久久精品成人热色戒| 久久国产精品久久国产精品| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | WWW婷婷AV久久久影片| 久久精品三级视频| 久久超乳爆乳中文字幕| 国色天香久久久久久久小说| 亚洲国产成人久久一区久久| 国产精品成人99久久久久91gav| 亚洲AV无码久久精品色欲| 欧美日韩精品久久免费| 中文国产成人精品久久不卡| 奇米影视7777久久精品人人爽| 中文字幕精品无码久久久久久3D日动漫 | 97久久超碰成人精品网站| 少妇高潮惨叫久久久久久| 精品久久久久久成人AV| 97久久精品无码一区二区| 青青草国产精品久久久久| 老司机午夜网站国内精品久久久久久久久 | 久久精品国产99久久久古代 | 伊人久久大香线蕉综合Av| 久久婷婷五月综合97色| 欧美成a人片免费看久久| 国产精品欧美久久久天天影视| 精品99久久aaa一级毛片|