国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

快速排序算法普及教程

移動開發 算法
咱們立刻進入本文章的主題,排序算法。眾所周知,快速排序算法是排序算法中的重頭戲。因此,本文就從快速排序開始。

[[121950]]

閑不多說。接下來,咱們立刻進入本文章的主題,排序算法。

眾所周知,快速排序算法是排序算法中的重頭戲。

因此,本文就從快速排序開始。

------------------------------------------------------

一、快速排序算法的基本特性

時間復雜度:O(n*lgn)

最壞:O(n^2)

空間復雜度:O(n*lgn)

不穩定。

快速排序是一種排序算法,對包含n個數的輸入數組,平均時間為O(nlgn),最壞情況是O(n^2)。

通常是用于排序的***選擇。因為,基于比較的排序,最快也只能達到O(nlgn)。

二、快速排序算法的描述

算法導論,第7章

快速排序時基于分治模式處理的,

對一個典型子數組A[p...r]排序的分治過程為三個步驟:

1.分解:

A[p..r]被劃分為倆個(可能空)的子數組A[p ..q-1]和A[q+1 ..r],使得

A[p ..q-1] <= A[q] <= A[q+1 ..r]

2.解決:通過遞歸調用快速排序,對子數組A[p ..q-1]和A[q+1 ..r]排序。

3.合并。

三、快速排序算法

版本一:

QUICKSORT(A, p, r)

 

  1. if p < r 
  2.    then q ← PARTITION(A, p, r)   //關鍵 
  3.         QUICKSORT(A, p, q - 1) 
  4.         QUICKSORT(A, q + 1, r) 

數組劃分

快速排序算法的關鍵是PARTITION過程,它對A[p..r]進行就地重排:

 

  1. PARTITION(A, p, r) 
  2.   x ← A[r] 
  3.   i ← p - 1 
  4.   for j ← p to r - 1 
  5.        do if A[j] ≤ x 
  6.              then i ← i + 1 
  7.                   exchange A[i] <-> A[j] 
  8.   exchange A[i + 1] <-> A[r] 
  9.   return i + 1 

ok,咱們來舉一個具體而完整的例子。

來對以下數組,進行快速排序,

  2   8   7   1   3   5   6   4(主元)

一、

i p/j

  2   8   7   1   3   5   6   4(主元)

j指的2<=4,于是i++,i也指到2,2和2互換,原數組不變。

j后移,直到指向1..

二、

              j(指向1)<=4,于是i++

i指向了8,所以8與1交換。

數組變成了:

       i          j

  2   1   7   8   3   5   6   4

三、j后移,指向了3,3<=4,于是i++

i這是指向了7,于是7與3交換。

數組變成了:

             i         j

  2   1   3   8   7   5   6   4

四、j繼續后移,發現沒有再比4小的數,所以,執行到了***一步,

即上述PARTITION(A, p, r)代碼部分的 第7行。

因此,i后移一個單位,指向了8

                 i               j

  2   1   3   8   7   5   6   4

A[i + 1] <-> A[r],即8與4交換,所以,數組最終變成了如下形式,

  2   1   3   4   7   5   6   8

ok,快速排序***趟完成。

4把整個數組分成了倆部分,2 1 3,7 5 6 8,再遞歸對這倆部分分別快速排序。

i p/j

  2   1   3(主元)

2與2互換,不變,然后又是1與1互換,還是不變,***,3與3互換,不變,

最終,3把2 1 3,分成了倆部分,2 1,和3.

再對2 1,遞歸排序,最終結果成為了1 2 3.

7 5 6 8(主元),7、5、6、都比8小,所以***趟,還是7 5 6 8,

不過,此刻8把7 5 6 8,分成了  7 5 6,和8.[7 5 6->5 7 6->5 6 7]

再對7 5 6,遞歸排序,最終結果變成5 6 7 8。

ok,所有過程,全部分析完成。

***,看下我畫的圖:

快速排序算法版本二

不過,這個版本不再選取(如上***版本的)數組的***一個元素為主元,

而是選擇,數組中的***個元素為主元。

 

  1. /**************************************************/ 
  2. /*  函數功能:快速排序算法                        */ 
  3. /*  函數參數:結構類型table的指針變量tab          */ 
  4. /*            整型變量left和right左右邊界的下標   */ 
  5. /*  函數返回值:空                                */ 
  6. /*  文件名:quicsort.c  函數名:quicksort ()      */ 
  7. /**************************************************/ 
  8. void quicksort(table *tab,int left,int right) 
  9.   int i,j; 
  10.   if(left<right) 
  11.   { 
  12.     i=left;j=right; 
  13.     tab->r[0]=tab->r[i]; //準備以本次最左邊的元素值為標準進行劃分,先保存其值 
  14.     do 
  15.     { 
  16.       while(tab->r[j].key>tab->r[0].key&&i<j) 
  17.         j--;        //從右向左找第1個小于標準值的位置j 
  18.       if(i<j)                               //找到了,位置為j 
  19.       { 
  20.         tab->r[i].key=tab->r[j].key;i++; 
  21.       }           //將第j個元素置于左端并重置i 
  22.       while(tab->r[i].key<tab->r[0].key&&i<j) 
  23.         i++;      //從左向右找第1個大于標準值的位置i 
  24.       if(i<j)                       //找到了,位置為i 
  25.       { 
  26.         tab->r[j].key=tab->r[i].key;j--; 
  27.       }           //將第i個元素置于右端并重置j 
  28.     }while(i!=j); 
  29.     tab->r[i]=tab->r[0];         //將標準值放入它的最終位置,本次劃分結束 
  30.     quicksort(tab,left,i-1);     //對標準值左半部遞歸調用本函數 
  31.     quicksort(tab,i+1,right);    //對標準值右半部遞歸調用本函數 
  32.   } 

----------------

ok,咱們,還是以上述相同的數組,應用此快排算法的版本二,來演示此排序過程:

這次,以數組中的***個元素2為主元。

  2(主)  8  7  1  3  5  6  4

請細看:

  2  8  7  1  3  5  6  4

  i->                     <-j

   (找大)               (找小)

一、j

j找***個小于2的元素1,1賦給(覆蓋重置)i所指元素2

得到:

  1  8  7     3  5  6  4

      i       j     

二、i

i找到***個大于2的元素8,8賦給(覆蓋重置)j所指元素(NULL<-8)

  1     7  8  3  5  6  4

      i   <-j

三、j

j繼續左移,在與i碰頭之前,沒有找到比2小的元素,結束。

***,主元2補上。

***趟快排結束之后,數組變成:

  1  2  7  8  3  5  6  4

第二趟,

        7  8  3  5  6  4

        i->             <-j

         (找大)        (找小)

一、j

j找到4,比主元7小,4賦給7所處位置

得到:

        4  8  3  5  6  

        i->                j

二、i

i找比7大的***個元素8,8覆蓋j所指元素(NULL)

        4     3  5  6  8

            i          j

        4  6  3  5     8

            i->       j

                 i與j碰頭,結束。

第三趟:

        4  6  3  5  7  8

......

以下,分析原理,一致,略過。

***的結果,如下圖所示:

  1  2  3  4  5  6  7  8

相信,經過以上內容的具體分析,你一定明了了。

***,貼一下我畫的關于這個排序過程的圖: 

完。一月五日補充。

OK,上述倆種算法,明白一種即可。

-------------------------------------------------------------

五、快速排序的最壞情況和最快情況。

最壞情況發生在劃分過程產生的倆個區域分別包含n-1個元素和一個0元素的時候,

即假設算法每一次遞歸調用過程中都出現了,這種劃分不對稱。那么劃分的代價為O(n),

因為對一個大小為0的數組遞歸調用后,返回T(0)=O(1)。

估算法的運行時間可以遞歸的表示為:

    T(n)=T(n-1)+T(0)+O(n)=T(n-1)+O(n).

可以證明為T(n)=O(n^2)。

因此,如果在算法的每一層遞歸上,劃分都是***程度不對稱的,那么算法的運行時間就是O(n^2)。

亦即,快速排序算法的最壞情況并不比插入排序的更好。

此外,當數組完全排好序之后,快速排序的運行時間為O(n^2)。

而在同樣情況下,插入排序的運行時間為O(n)。

//注,請注意理解這句話。我們說一個排序的時間復雜度,是僅僅針對一個元素的。

//意思是,把一個元素進行插入排序,即把它插入到有序的序列里,花的時間為n。

再來證明,最快情況下,即PARTITION可能做的最平衡的劃分中,得到的每個子問題都不能大于n/2.

因為其中一個子問題的大小為|_n/2_|。另一個子問題的大小為|-n/2-|-1.

在這種情況下,快速排序的速度要快得多。為,

      T(n)<=2T(n/2)+O(n).可以證得,T(n)=O(nlgn)。

直觀上,看,快速排序就是一顆遞歸數,其中,PARTITION總是產生9:1的劃分,

總的運行時間為O(nlgn)。各結點中示出了子問題的規模。每一層的代價在右邊顯示。

每一層包含一個常數c。

=============================================

請各位自行,思考以下這個版本,對應于上文哪個版本?

 

  1.    HOARE-PARTITION(A, p, r) 
  2. x ← A[p] 
  3. i ← p - 1 
  4. j ← r + 1 
  5. while TRUE 
  6.     do repeat j ← j - 1 
  7.          until A[j] ≤ x 
  8.        repeat i ← i + 1 
  9.          until A[i] ≥ x 
  10.        if i < j 
  11.           then exchange A[i] ↔ A[j] 
  12.           else return j 

我常常思考,為什么有的人當時明明讀懂明白了一個算法,

而一段時間過后,它又對此算法完全陌生而不了解了列?

我想,究其根本,還是沒有徹底明白此快速排序算法的原理,與來龍去脈...

那作何改進列,只能找發明那個算法的原作者了,從原作者身上,再多挖掘點有用的東西出來。

=========================================

***,再給出一個快速排序算法的簡潔示例:

Quicksort函數

 

  1. void quicksort(int l, int u) 
  2. {   int i, m; 
  3.     if (l >= u) return
  4.     swap(l, randint(l, u)); 
  5.     m = l; 
  6.     for (i = l+1; i <= u; i++) 
  7.         if (x[i] < x[l]) 
  8.             swap(++m, i); 
  9.     swap(l, m); 
  10.     quicksort(l, m-1); 
  11.     quicksort(m+1, u); 

如果函數的調用形式是quicksort(0, n-1),那么這段代碼將對一個全局數組x[n]進行排序。

函數的兩個參數分別是將要進行排序的子數組的下標:l是較低的下標,而u是較高的下標。

函數調用swap(i,j)將會交換x[i]與x[j]這兩個元素。

***次交換操作將會按照均勻分布的方式在l和u之間隨機地選擇一個劃分元素。

作者:July

責任編輯:閆佳明 來源: v_JULY_v
相關推薦

2014-10-30 15:59:10

2025-10-17 01:55:00

排序算法快速排序Lomuto

2011-04-20 15:20:03

快速排序

2021-03-04 07:24:28

排序算法優化

2014-10-30 15:08:21

快速排序編程算法

2023-03-07 08:02:07

數據結構算法數列

2023-05-08 07:55:05

快速排序Go 語言

2014-03-03 16:44:57

算法

2022-03-07 09:42:21

Go快速排序

2021-01-26 05:33:07

排序算法快速

2021-07-16 04:57:45

Go算法結構

2020-06-28 14:51:15

容器Gartner軟件提供商

2013-05-17 11:14:09

大數據Hadoop

2023-10-05 09:01:05

插入排序對象序列log2i

2012-05-14 13:58:19

Erlang

2011-04-20 13:56:08

選擇排序

2011-04-20 14:07:37

冒泡排序

2011-04-20 14:19:00

希爾排序

2011-04-20 15:06:44

堆排序

2021-01-19 07:02:26

算法數據結構堆排序
點贊
收藏

51CTO技術棧公眾號

国产精品久久久久久久龚玥菲| 99国产精品一区二区| 日韩精品中文字幕一区二区| 性8sex亚洲区入口| 亚洲一区二区高清| 中文字幕精品久久久久| 99久久无色码| 欧美s码亚洲码精品m码| 麻豆视频在线免费观看| 国产精品亚洲片在线播放| 亚洲欧美aⅴ...| 欧美极品少妇xxxxx| 国产av麻豆mag剧集| 欧美日韩在线观看首页| 老司机亚洲精品| 欧美色图第一页| 91老司机在线| 天天操天天爱天天爽| 亚洲精品成a人ⅴ香蕉片| 欧美激情综合五月色丁香小说| 欧美激情欧美激情| jizzzz日本| 国内精品视频| 中文字幕欧美激情一区| 久久亚洲国产精品成人av秋霞| 一区二区在线观| 高清毛片在线看| 久久亚洲视频| 欧美福利小视频| 在线观看黄网| 欧美日韩 国产精品| 3d成人h动漫网站入口| 不卡视频一区二区| 在线观看操人| 丁香亚洲综合激情啪啪综合| 中文字幕欧美亚洲| 日日碰狠狠添天天爽超碰97| 欧美亚洲人成在线| 婷婷开心激情综合| 蜜桃久久精品乱码一区二区| 成人久久网站| 亚洲国产欧美在线| 夜夜夜精品看看| 久草在线免费福利| jizz18女人| 一区二区三区四区在线看| 国产98色在线|日韩| 国产精品久久久久久一区二区| 在线看av的网址| 国产精品99一区二区| 日韩欧美国产电影| 日韩成人手机在线| 成人在线精品| 国产精品自拍在线| 日韩精品电影网| 男人插曲女人视频免费| 黄色综合网站| 亚洲精品有码在线| 四虎最新网站| 国内精品福利| 亚洲精品91美女久久久久久久| 正在播放亚洲| 综合激情婷婷| 在线看日韩欧美| 天天干狠狠干| 欧美成人午夜视频| 在线免费观看日本欧美| 欧美不卡三区| 粉嫩的18在线观看极品精品| 欧美日韩国产精品成人| 亚洲午夜精品福利| 在线亚洲a色| 日韩欧美亚洲国产另类| 啊啊啊一区二区| 加勒比久久综合| 国内精品模特av私拍在线观看| 一级毛片视频在线| 国产精品护士白丝一区av| 日韩欧美在线电影| 麻豆精品av| 亚洲图中文字幕| 波多野结衣在线影院| 成人午夜免费av| 日韩欧美亚洲在线| 麻豆久久久久久| 欧美系列一区| 国产精品久久久久久模特| 国产精品激情av电影在线观看| 在线观看精品| 欧美精品第一页| 最近97中文超碰在线| 91蝌蚪porny| 91精品入口蜜桃| 亚洲欧美日韩国产一区| 亚洲资源在线网| 国产福利视频一区二区三区| 亚洲蜜桃在线| 亚洲一区区二区| 国产精品久久久久久中文字| 中文.日本.精品| 欧美一区二区国产| yw193.com尤物在线| 欧美国产日韩一二三区| 亚洲网友自拍| 欧美日韩亚洲国产综合| 涩爱av在线播放一区二区| 中文字幕在线一区| 久久久久久三级| 成人h版在线观看| 91视频成人免费| 日韩主播视频在线| jizzjizzxxxx| 亚洲素人一区二区| 国产91久久久久蜜臀青青天草二| 欧美日韩精品免费观看视频| 99re8在线精品视频免费播放| 不卡毛片在线看| 在线观看操人| 国产一区二区三区在线观看网站 | 亚洲大片精品免费| 欧美中文字幕在线视频| 欧美精品一二| 久久久www免费人成黑人精品| 久久电影网电视剧免费观看| 欧美午夜性视频| 亚洲色诱最新| 亚洲国产精品影视| 国产精品视频在线看| 国产在线小视频| 亚洲深夜福利视频| 欧美亚洲激情| 亚洲高清视频一区| 国产欧美日韩综合精品一区二区| 高清美女视频一区| 超碰精品一区二区三区乱码| 日韩欧美1区| 久久精品在线免费视频| 亚洲午夜激情av| 999福利在线视频| 欧洲亚洲妇女av| 国产一区二区调教| 欧美激情视频一区二区三区| 中文字幕精品三区| 色呦呦在线资源| 国产精品三级在线| 久久综合色天天久久综合图片| 精品国产丝袜高跟鞋| 国产乱肥老妇国产一区二 | 欧美激情一区二区三区高清视频 | 久热精品视频在线观看一区| 视频一区欧美日韩| 亚洲网站情趣视频| 久久久久久国产精品| 男女男精品视频网| 免费黄网在线观看| 国产精品久久久久久久久久免费| 极品少妇一区二区三区精品视频| 欧美日韩激情视频一区二区三区| 欧美国产亚洲视频| 福利电影一区二区三区| 麻豆av在线播放| 日韩经典在线视频| 99国产精品久久久久久久久久| 日本一区免费| 日韩欧美极品在线观看| 高清精品视频| 日韩亚洲欧美一区二区| 欧美一区二区三区的| 亚洲精品中文字幕乱码| 色网址在线观看| 高清欧美性猛交xxxx黑人猛交| 大桥未久av一区二区三区中文| 久久av色综合| 日韩高清av| 精品国产一区二区在线观看| 在线亚洲国产精品网站| 成人激情电影在线看| 99视频国产精品免费观看| 亚洲午夜电影网| 成人婷婷网色偷偷亚洲男人的天堂| 色老板视频在线观看| 国产精品www网站| 亚洲一区免费在线观看| 精品国产91乱码一区二区三区四区 | 国产亚洲一区二区在线观看| 日韩av黄色| 国产精品自拍视频在线| 欧美中文在线观看| 五月开心婷婷久久| 亚洲澳门在线| 先锋成人av| 精品国偷自产一区二区三区| 欧美乱妇40p| 亚洲日本va在线观看| 精品盗摄女厕tp美女嘘嘘| 男女污污视频在线观看| 黄色国产精品一区二区三区| 亚洲第一页中文字幕| 久久久.com| 成人综合一区|