選擇排序 包含堆排序

2021-07-31 15:46:27 字數 2248 閱讀 9230

每一趟都從n-i+1(i=1,2,3….n-1)個記錄中選擇出最小的關鍵字,作為有序序列的第i個元素。

陣列a,長度為:n,臨時變數:i,初始化為1

- 從a[i]~a[n]這n-i+1個元素中,找出最小的關鍵字,並且記錄其下標

- 如果該關鍵字不是a[i]~a[n]這個序列的第乙個元素,則將該兩個位置的元素替換

- 將i從1~n-1,遞增迴圈執行上述兩個步驟

#include

using

namespace

std;

typedef

int datatype; //編譯期多型的一種:轉換

void print(datatype * data, int i, int length)

cout

<< endl;

}void easyselectsort(datatype * data, const

int length)

}if (temp != i)

print(data, i, length);

}}void main() ;

easyselectsort(data, sizeof(data) / sizeof(int));

system("pause");

}

結果:

我們通過分析可以知道,我們程式無論是什麼情況,都要比較:n*(n-1)/2次。所以程式的時間複雜度為:o(n^2)。

穩定的定義就是:兩個相同的數,在排完序後前後的相對順序沒有改變。對於簡單選擇排序,它是不穩定的,我可以簡單的舉個例子:,當我們進行簡單選擇排序後,第乙個7會和2調換位置,從出現不穩定的情況

簡單的選擇排序為了得出有序的序列,對於任意序列都要比較:n*(n-1)/2次。那麼我們要優化這個演算法的話,那麼就要減少我們的比較的次數。所以從比較這裡出發:我們為得出n個關鍵字中的最小的值,需要比較n-1次,而下一次要得出n-1個關鍵字中最小的值時,同樣又要比較n-2次,如果我們可以利用之前的n-1次的比較結果,那麼我們就可能在下一次尋找中,減少比較次數,從而就可以提高程式的效率了。堆就可以記錄這些資訊,所以我們就提出了另外一種優化的選擇排序:堆排序

用乙個完全二叉樹來表示堆,堆有兩種:最大堆和最小堆。

- 最大堆:所有結點都比它們的左右孩子大。調整過程出現兩個孩子結點,都大於父結點,選擇大的那個替換。

- 最小堆:所有結點都比它們的左右孩子小。調整過程出現兩個孩子結點,都小於父結點,選擇小的那個替換。

堆排序的大體思路是(以最小堆為例):

- 首先建立初始堆

- 輸出根結點,用最後乙個結點替換根結點,刪除最後乙個結點,並且對堆進行調整,使其還是滿足最小堆的性質。

- 重複,第二個過程,直到堆為空為止

我們從思路分析,可以知道我們需要解決兩個問題:

- 建立初始堆

- 輸出後,對堆的調整

void

heapadjust(datatype * data, int length, int s)

//此時已經滿足最小堆了條件了,可以停止尋找了

if (temp <= data[j])

//交換根結點和孩子結點的值

data[s] = data[j];

s = j;

}//最後,確定了我們那個關鍵需要存放的地方

data[s] = temp;

}void

heapsort(datatype * data, int length)

int n = length - 1;

//這裡我們只需要比較前length-1個數,最後乙個數的值也就確定了

while (n >= 1)

cout << data[n];

cout << endl;

}

在主函式中,呼叫上述的heapsort函式,就可以進行堆排序了。

這裡的時間主要是花費在呼叫heapadjust函式中,heapadjust函式最多做:⌈log2n⌉次調整,總共需要呼叫:(n/2)+(n-1)次heapadjust函式,所以該時間複雜度為:o(nlog2n)

堆排序是不穩定的排序演算法,比如有無序的序列:,所以在輸出3後,最後的那個27替換到了根節點,從這裡就可以看出該演算法是不穩定的。

堆排序的時間複雜也是為:o(nlog2n),而且是最多就是:o(nlog2n)。對於時間複雜同樣是:o(nlog2n)的排序演算法:快速排序和歸併排序來說,它只是在最壞情況下是佔優勢的。具體可以參考:

堆和快排、歸併的比較

排序演算法(3) 選擇排序(包含簡單選擇和堆排序)

1.簡單選擇排序 void selectsort int list if k i 2.堆排序進行堆排序時,我們得先明白幾個概念 堆 堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或key i key 2i 1 key key 2i 2...

排序 選擇排序 選擇排序 堆排序

寫在前面 上傳github交換排序選擇排序 堆排序 選擇排序 顧名思義,我們就可以猜到,它是原則合適的元素放到合適的位置 從圖中,我們可以得到 1.用第乙個元素,和其他所有的元素進行比較,找出最小的,然後進行交換 2.然後進行,資料的遞增 3.直到資料全部有序 void selectsort int...

選擇排序 堆排序

選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 比如序列 5,5,3 第一次就將第乙個 5 與 3 交換,導致第乙個5挪動到第二個...