C 資料結構與演算法揭秘16

2022-02-09 16:57:51 字數 2810 閱讀 8627

這節我們就用的最多的演算法——排序發起重點的討論。  

常見的排序分為氣泡排序,快速排序,直接插入排序 ,希爾排序,基數排序 ,簡單選擇排序 ,堆排序  等等。

一、氣泡排序

氣泡排序(bubble sort)的基本思想是:將相鄰的記錄的關鍵碼進行比較,若前面記錄的關鍵碼大於後面記錄的關鍵碼,則將它們交換,否則不交換。

設待排序的順序表 sqlist 中有 n 個記錄,氣泡排序要進行 n-1 趟,每趟迴圈均是從最後兩個記錄開始。 第 1 趟迴圈到第 2 個記錄的關鍵碼與第 1 個記錄的關鍵碼比較後終止, 第 2 趟迴圈到第 3 個記錄的關鍵碼與第 2 個記錄的關鍵碼比較結束後終止。一般地,第 i 趟迴圈到第 i+1 個記錄的關鍵碼與第 i 個記錄的關鍵碼比較後終止,所以,第 n-1 趟迴圈到第 n 個記錄的關鍵碼與第 n-1 個記錄的關鍵碼比較後終止。

氣泡排序演算法的實現如下所示,演算法中記錄的比較表示記錄關鍵碼的比較,順序表中只存放了記錄的關鍵碼: 實現的源**如下:

//

進行氣泡排序的方法

public

void bubblesort(seqlistsqlist)

} } }//

由於是雙層迴圈 演算法的時間的複雜度是o(n^2)

氣泡排序演算法的最好情況是記錄已全部排好序,這時,迴圈 n-1 次,每次迴圈都因沒有資料交換而退出。因此,氣泡排序演算法在最好情況下的時間複雜度為o(n)。

總的移動次數為比較次數的 3 倍, 因為被進行一次比較, 需要進行 3 次移動。因此,氣泡排序演算法在最壞情況下的時間複雜度為o(n2)。

氣泡排序演算法只需要乙個輔助空間用於交換記錄,所以,氣泡排序演算法是一種穩定的排序方法。什麼是穩定的排序演算法,就是前面與後面的數字相等的話,不用交換。

二、快速排序

快速排序(quick sort)的基本思想是:通過不斷比較關鍵碼,以某個記錄為界(該記錄稱為支點) ,將待排序列分成兩部分。其中,一部分滿足所有記錄的關鍵碼都大於或等於支點記錄的關鍵碼, 另一部分記錄的關鍵碼都小於支點記錄的關鍵碼。把以支點記錄為界將待排序列按關鍵碼分成兩部分的過程,稱為一次劃分。對各部分不斷劃分,直到整個序列按關鍵碼有序為止。

設待排序的順序表 sqlist 中有 n 個記錄,一般地,第一次劃分把第乙個記錄作為支點。首先,把支點複製到乙個臨時儲存空間中,並設兩個指示器,乙個指示器 low,指向順序表的低端(第乙個記錄所在位置) ,乙個指示器 high,指向順序表的高階(最後乙個記錄所在位置) 。然後,從 high 所指向的記錄開始,將記錄的關鍵碼與支點(在臨時儲存空間中)的關鍵碼進行比較,如果 high 所指向的記錄的關鍵碼大於支點的關鍵碼,high 指示器向順序表的低端方向移動乙個記錄的位置,否則,將 high 所指的記錄複製到 low 所指的儲存空間中。接著,又將 low 移到下乙個記錄,從 low 所指向的記錄開始,將記錄的關鍵碼與臨時儲存空間的記錄的關鍵碼進行比較, 如果 low 所指向的記錄的關鍵碼小於臨時儲存空間的記錄的關鍵碼,low 指示器向順序表的高階方法移動乙個記錄的位置,否則,將 low 所指的記錄複製到 high 所指的儲存空間中,high 指示器向順序表的低端移動乙個記錄的位置。如此重複,直到 low 和 high 指示器指向同乙個記錄,

將臨時空間的記錄賦給 low 所指向的儲存空間,第一次劃分結束。如圖所示:

快速排序的演算法實現如下所示,演算法中記錄的比較表示記錄關鍵碼的比較順序表中只存放了記錄的關鍵碼。相應源**如下:

1

public

void quicksort(seqlist sqlist, int low, int

high) 2

16 sqlist[low] =sqlist[high];

17 ++low;

18while ((low < high) && (sqlist[low] <=tmp)) 19

22 sqlist[high] =sqlist[low];

23 --high;

24}

25 sqlist[low] =tmp;

26//

新一輪的變換

27if (i < low-1

) 28 31

//新一輪的遞迴

32if (low+1

36} 37}

38//

由於用到遞迴 迴圈 時間複雜度是o(nlog2n)

快速排序演算法的時間複雜度和每次劃分的記錄系很大。 如果每次選取的記錄都能均分成兩個相等的子串行,這樣的快速排序過程是一棵完全二叉樹結構(即每個結點都把當前待排序列分成兩個大小相當的子串行結點,n個記錄待排序列的根結點的分解次數就構成了一棵完全二叉樹) ,這時分解次數等於完全二叉樹的深度log2n。每次快速排序過程無論把待排序列這樣劃分,全部的比較次數都接近於n-1 次,所以,最好情況下快速排序的時間複雜度為o(nlog2n) 。快速排序演算法的最壞情況是記錄已全部有序,此時n個記錄待排序列的根結點的分解次數就構成了一棵單右支二叉樹。 所以在最壞情況下快速排序演算法的時間複雜度為o(n2)。一般情況下,記錄的分布是隨機的,序列的分解次數構成一棵二叉樹,這樣二叉樹的深度接近於log2n,所以快速排序演算法在一般情況下的時間複雜度為o(nlog2n) 。 另外,快速排序演算法是一種不穩定的排序的方法。不穩定排序的演算法 ,前後數字相等要交換。

這節,我們介紹了快速排序和氣泡排序。下節,我們介紹直接插入排序和希爾排序。嘎嘎。

資料結構與演算法 揭秘

字面意思就是研究資料的一種方法,就是研究資料在程式中組織的一種方法。資料結構就是,元素與元素有一種或者多種關係的集合,在軟體界有一種比較普片的公式就是程式 資料結構 演算法。1 集合 set 和數學的集合一樣,具有唯一性,確定性,無序性。2 線性結構 典型的資料庫二維表,一對一的關係。3 樹形結構 ...

C 資料結構與演算法揭秘一

這裡,我們 來說一說c 的資料結構了。什麼是資料結構。資料結構,字面意思就是研究資料的方法,就是研究資料如何在程式中組織的一種方法。資料結構就是相互之間存在一種或多種特定關係的資料元素的集合。程式界有一點很經典的話,程式設計 資料結構 演算法。用源 來體現,資料結構,就是程式設計。他有哪些具體的關係...

C 資料結構與演算法揭秘13

這節,我們來看看一下什麼了,來看看圖的遍歷吧!首先,搞清楚,圖的遍歷的基本的含義了。圖的遍歷是指從圖中的某個頂點出發,按照某種順序訪問圖中的每個頂點,使每個頂點被訪問一次且僅一次。圖的遍歷與樹的遍歷操作功能相似。圖的遍歷是圖的一種基本操作,並且圖的許多其他操作都是建立在遍歷操作的基礎之上的。遍歷示意...