資料結構 排序演算法 選擇排序和堆排序

2021-08-18 05:43:34 字數 1452 閱讀 1551

選擇排序

1.基本思想

以公升序為例,假設有n個資料,每一趟在後面n-i的待排序的資料元素集合中選出關鍵碼最小的資料元素,作為有序序列的第i個元素,直至待排序集合中只剩下1個元素。

2.操作步驟

舉乙個例子:

3.演算法效能

時間複雜度:直接選擇演算法需要遍歷每一趟選出最小的乙個數,遍歷n遍,時間複雜度為o(n^2)

穩定性:是一種不穩定的演算法。

void selectsort(int* array, int size)

if(maxpos != size - i - 1)

swap(array[maxpos], array[size - i - 1]);}}

我們可以對這種直接選擇排序法進行改進,在上述的演算法中,我們每一次從前向後的n-i(i從0開始)個資料中找最小的資料,並將其放到第i個位置;這裡改變一下,不光從前向後找最下的資料,同時,從後向前找最大的資料,分別把他們放到對應的位置,這樣,我們就可以少跑幾趟了。

void selectsortop(int* array, int size)

if(maxpos != end)

swap(array[maxpos], array[end]);

if (minpos == end)//最小元素出現在最大元素的位置

minpos = maxpos;

if(minpos != begin)

swap(array[minpos], array[begin]);

begin++;

end--;}}

堆排序

1.基本思想

堆排序是指利用堆這種資料結構所進行的排序,利用陣列的特點快速定位指定索引的元素。利用堆進行排序,比較的次數和交換的次數均比氣泡排序或選擇排序少,效能較高。

2.具體步驟

建立堆:如果要排公升序,需要建立大堆;降序,則需要小堆;

將堆頂的元素和當前最後乙個元素交換;

最大堆元素個數減1;

向下調整,使之滿足最大堆的定義

重複上述2-4步,直至陣列為空。

3.演算法效能

時間複雜度:堆排序的時間,主要由建立乙個最大堆和每次堆頂元素交換後進行調整兩部分的時間開銷構成,堆排序的平均時間複雜度為o(n*logn)

空間複雜度:就地排序,輔助空間為o(1)

穩定性:是一種不穩定的排序方法。

void adjust(int* array, int size, size_t parent)

else

break;

}}void heapsort(int* array, size_t size)

}

資料結構和演算法 排序演算法之二 選擇排序和堆排序

一 選擇排序 1 思想 假設有十張撲克牌放在桌上,我們需要按從小到大的順序拿到手上,每次只能選擇一張牌拿到手上,那麼每一次我們都必須從桌上的撲克牌中選擇最小的牌拿起來,一次迴圈十次,這樣就將撲克牌按從小到的順序拿到手上了。這就是選擇排序。2 實現 選擇排序 輸入 待排序陣列 a 和陣列個數 n 輸出...

資料結構 排序 選擇排序 堆選擇排序法

資料結構 排序 選擇排序 堆選擇排序法 1.堆排序定義 n個關鍵字序列kl,k2,kn稱為堆,當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k2i且ki k2i 1 或 2 ki k2i且ki k2i 1 1 i 若將此序列所儲存的向量r 1.n 看做是一棵完全二叉樹的儲存結構,則堆實質上是滿...

資料結構 排序 選擇排序 堆選擇排序法

1.堆排序定義 n個關鍵字序列kl,k2,kn稱為堆,當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k2i且ki k2i 1 或 2 ki k2i且ki k2i 1 1 i 若將此序列所儲存的向量r 1.n 看做是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹 樹中任一非葉結點...