交換排序之堆排序

2021-07-29 08:59:33 字數 1047 閱讀 6989

選擇排序

選擇排序(selection sort)的基本思想是:第i趟在剩餘的n-i+1中選擇第i小的記錄。其中最簡單的事簡單選擇排序(****** selection sort)。

一、 簡單選擇排序:

如上文所述。

void selectionsort(intl)

for(i=1; i < l.length; ++i)

j = 從i到l.length中選擇最小的記錄的位置

if(i!=j)

l[i]=l[j];

由上圖可知,選擇排序的主要操作在於比較,而不在於移動資料,所以優化方面主要應該減少比較次數,利用前n-1次的比較資訊,就能有效地優化演算法。

二、樹形選擇排序

從體育錦標賽中獲得靈感,如果在體育比賽中有三名參賽選手a、b、c、d,想要決出名次的話,需要進行三場比賽而非六場,沒有必要a與b\c\d都決出勝負,如果在決賽中a戰勝了d,即便a沒有與c戰鬥,那麼也可以認為a是比c強的。

所以樹形選擇排序(tree selection sort)又稱為錦標賽排序(tournament sort),根節點是最小的節點。

建立一顆log2n+1的完全二叉樹,進行深度次的比較,所以時間複雜度為o(nlogn)

三、堆排序

heapsort需要記錄乙個記錄大小的輔助空間。

在乙個長為n的的陣列內,滿足第i個記錄小於等於第2i和第(2i+1)個記錄,則成為最小堆,反之稱為最大堆。

陣列首個記錄為最小值,由於為完全二叉樹,所以每個父節點必有兩個子節點。

堆排序對記錄數比較少的檔案不值得提倡,時間花費主要在建立初始堆和調整新堆時的反覆篩選上,所以在最壞的情況下,時間複雜度也為o(nlogn),這是相對於快速排序來說,最大的優點。

交換排序之快速排序

1.基本思想 假設要排序的陣列是array 0 array n 1 首先任意選取乙個資料 通常選用第乙個資料 作為關鍵資料,然後將所有比它的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。一趟快速排序的演算法是 1 設定兩個變數i j,排序開始的時候i 0,j n 1 2 以第...

交換排序之氣泡排序

大學學的演算法已經基本遺忘了,最近又重新撿起來好好鑽研一下,那麼就先從排序開始。先說交換排序中的氣泡排序,這個是比較基礎的乙個排序演算法。1 基本思想 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即 每當兩相鄰的數比較...

交換排序之快速排序

問題及 檔名稱 main.cpp 作 者 徐群壯 完成日期 2015.12.15 版 本 號 v1.0 問題描述 資料結構例程 交換排序之快速排序 輸入描述 程式輸出 1.以第1個元素作為基準 include define maxsize 20 typedef int keytype 定義關鍵字型別...