詳談直接插入排序、冒泡排序時間複雜度過程推導----軟考

想了解時間複雜度首先要將排序過程弄懂。

直接插入排序

首先有一組n個數的數組。我們進行升序排列。

先選前兩個數進行比較,進行升序排列組成一個有序序列。然後每次從數組後面的無序序列中拿一個數進行比較。找到合適位置插入。

 

最好情況

數組本來就是升序數組,每趟排序只需要做一次比較,並且不需要移動元素。n個元素就只需要比較n-1次即可。

舉例說明:1、2、3、4、5、6

1與2比較,2比1大,無序移動,1.、2現在排好序了,接下來從3、4、5、6中拿出打頭的3與2進行比較,比2大,就不需要與1在進行比較了。3在2後面,無需移動。以此類推,比較5次就好。

5可以直接由n-1得到的,所以取n-1的最大次冪n爲時間複雜度。

 

最壞情況

數組原本是降序數組,每次排序都要與之前排好序的有序序列的所有數進行比較,n個元素要比較n*(n-1)次

舉例說明:6、5、4、3、2、1

6與5比較,6比5大,講6放在5後面,5、6排好序,接下來從4、3、2、1中拿出打頭的4與6比較,4比6小,則4繼續與5比較,同樣4還是小,但是5現在爲排好序的序列第一個數,所以4直接插入到5前面,4、5、6排好序,這次比較了兩次。以此類推,後面會比較3次、4次、5次。

用代數法進行計算,n個數的降序序列排成升序序列,要比較這麼多1+2+3+···+n-1次,1+2+3+···+n-1可以化簡成n^2-n,所以取n的最大次冪n^2爲時間複雜度

 

冒泡排序

同樣也是一組n個數的數組。我們進行升序排列。

首先將第一個數和第二個數進行比較,若爲逆序,則交換這兩個數,然後比較第二個和第三個數,以此類推,直到比較到結束爲止。第一趟冒泡比較出最大的數放在第n個數的位置。然後進行第二趟排序,對前n-1個數進行相同的操作,選出前n-1個數中最大的放在n-1位置上。反覆進行幾趟排序操作,直到所有數有序排列。

 

最好情況

數組本來就是升序數組,每次比較不需要移動元素。n個元素進行一趟排序操作比較n-1次即可。

舉例說明:1、2、3、4、5、6

1與2比較,2比1大,無序移動,1.、2現在排好序了,接下來2、3比較也無需移動。再3、4比較,以此類推,比較5次就好。

5可以直接由n-1得到的,所以取n-1的最大次冪n爲時間複雜度。

 

最壞情況

數組原本是降序數組,每趟排序都要將前面最大的數交換到最後面,n個元素要比較n*(n-1)次

舉例說明:6、5、4、3、2、1

6與5比較6大,交換位置,6和4比較,交換位置,以此類推,一直到6被交換到最後一位,比較了5次,第一趟排序完,目前隊列還不是有序的,再次進行,第二趟比較4次,剩下的依次比較3、2、1次。

用代數法進行計算,n個數的降序序列排成升序序列,要比較(n-1)+(n-2)+···+2+1可以化簡成n^2-n,所以取n的最大次冪n^2爲時間複雜度

 

爲什麼將直接插入排序和冒泡排序放到一起講時間複雜度?

因爲這兩個排序過程非常相似,唯一的不同就是,冒泡排序每次比較完之後,當符合排序條件時,它就會馬上與相比較的數互換位置。而直接插入排序是隻要滿足條件就一直比較,只有在找到合適位置時才插入進去。相對來說,直接插入排序比較方便。

但是兩個排序方法對同一組數進行排序,比較的次數都是一樣的。所以時間複雜度也是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章