資料結構與演算法 十五 排序演算法

2021-09-22 16:46:35 字數 1939 閱讀 4789

排序演算法是最基本的演算法之一,也是平時最常見、最常用的演算法。

對於乙個未排序的序列, 其中a[2]和a[5]的關鍵字值相等,經過排序後,若原a[2]的位置仍在原a[5]之前,那麼稱該排序方法是穩定的;若原a[5]的位置反在原a[2]的前面,那麼稱該排序方法是不穩定的。

只要有一組關鍵字發生類似的情況,便認為此排序方法不穩定。排序演算法是否穩定,需要通過仔細分析才能得出。

舉個栗子:未排序前令狐沖和張無忌的總分是一樣的,令狐沖的排名在張無忌之前,經過排序後,若令狐沖的排名仍在張無忌之前,那麼該排序方法就是穩定的;若令狐沖的排名在張無忌的後面,那麼該排序方法就是不穩定的。

根據在排序過程中待排序的記錄是否全部被放在記憶體中,將排序方式分為:內排序和外排序。

內排序是在排序整個過程中,待排序的所有記錄全部被放在記憶體中。

外排序是由於待排序記錄個數太多,不能同時放在記憶體中,整個排序過程需要在內外存之間多次交換資料才能進行。

內排序演算法的效能主要受三個方面的影響:

1、時間效能:排序演算法的時間開銷是衡量其好壞的最重要標誌,主要進行兩種操作:比較和移動。高效率的內排序演算法應該是具有盡可能少的關鍵字比較次數和盡可能少的記錄移動次數。

2、輔助空間:執行演算法所需要的輔助儲存空間的大小。

3、演算法複雜度:這裡是指演算法本身的複雜度,而不是時間複雜度。演算法本身過於複雜也會影響排序效能。

選擇排序:當資料量較小的時候適用。

插入排序:當資料量較小的時候適用,且當資料越有序效率越高。

希爾排序:當資料量大的時候適用。

堆排序:當資料量大的時候適用。

快速排序:在資料的規模大且資料是亂序的情況下,是最快的排序演算法;在資料近乎有序的情況下,效率極低,不建議使用。

下表是我實測我實現的所有排序演算法的耗時,人為測試存在一定誤差:

排序方式/數量級千萬

十萬百萬

千萬簡單氣泡排序

0.004

0.506

55.867xx

標準氣泡排序

0.003

0.379

43.434xx

優化氣泡排序

0.003

0.371

42.534xx

雞尾酒排序

0.003

0.319

31.589xx

直接選擇排序

0.002

0.135

12.011xx

優化選擇排序

0.001

0.074

7.647xx

直接插入排序

0.001

0.075

7.651xx

希爾排序

x0.002

0.027

0.406

7.323

堆排序x

0.002

0.021

0.322

4.565

快速排序

x0.0015

0.017

0.228

4.465

優化快速排序

x0.0015

0.016

0.219

4.351

x表示太快或太久

由表可以看出:

資料結構與演算法 排序演算法

帶問題思考以下幾點 1 每個演算法的思想是什麼?2 每個演算法的穩定性怎樣?時間複雜度是多少?3 在什麼情況下,演算法出現最好情況 or 最壞情況?4 每種演算法的具體實現又是怎樣的?n每次選擇乙個元素k插入到之前已排好序的部分a 1 i 中,插入過程中k依次由後向前與a 1 i 中的元素進行比較。...

資料結構與演算法 排序演算法 快速排序

源 cpp view plain copy include void quicksort int int,int intfindposs int int,int intmain quicksort arry,0,6 printf after sorted n for i 0 i 7 i printf...

資料結構與演算法 排序

排序原理 1.比較相鄰的元素。如果前乙個元素比後乙個元素大,就交換這兩個元素的位置。2.對每一對相鄰元素做同樣的工作,從開始第一對元素到結尾的最後一對元素。最終最後位置的元素就是最大 值。氣泡排序的 實現 public static void sortpop int arr 測試 public st...