選擇排序 直接選擇排序與堆排序

2021-08-03 07:05:54 字數 1337 閱讀 4758

選擇排序即每次從待排序的數列中選擇乙個最小的元素,然後把它放在已排好序列的最前面(假定這裡從小到大排序),直至序列完全有序。

選擇排序分為線性結構的直接選擇排序與非線性的堆排序,後者是用相當於把樹的元素存在陣列中,通過元素下標來區分孩子結點與父親結點等等

1.直接選擇排序

直接上**

void select_sort(int* a, int n) 

/* 不要用下面的迴圈代替上面的for迴圈與乙個if語句,雖然功能一樣,但是前者效率更高

for (int j = i + 1; j < n; ++j)

}*/

}}

2.堆排序

首先是建立相應堆,如果是從小到大排序即建立最大堆,如果從大到小側建立最小堆,然後在進行排序

假設這裡是從小到大排序建立最大堆。

最大堆的建立:從堆的第乙個分支結點開始,依次與其孩子結點比較,找到最大的那個結點讓其位於父親結點的位置,並逐步處理該節點的孩子結點,直至滿足父親結點比  孩子結點值都大。建立之後很明顯根節點是序列中最大值的那個。

這裡其實可以看出,堆的特性很利於我們求數列中第k大的數字,這裡只需要建立乙個大小為k最小堆,堆頂就是第k大的那個元素,比如有10個元素,求第三大的元素,先取三個數字建立乙個最小堆,這裡假設取前三個數字,將這三個數字建立為最小堆,然後從第四個數字開始與該堆頂元素比較,如果比堆頂元素小側捨棄不要,如果被堆頂元素大側替換堆頂元素並維護該最小堆,用同樣方法依次處理第5-10個元素。

排序過程:由於最大堆的堆頂元素即為該序列的最大元素,所以讓他與堆頂最後乙個元素交換,然後維護堆(此時把堆的大小減一,因為已經歸位乙個元素),依次處理直至堆的大小為1

建立堆

//把當前需要下移的元素下移

void siftdown(int* h, int i)

else

flag = 1; //標誌沒必要下移了,因為當前元素比它的孩子都大 }}

void swap(int* h, int m, int n)

//建立最大堆

void creat(int* h, int n)

堆排序

//堆排序(這裡是從小到大排序)

void heapsort(int* h, int n)

}

直接選擇排序:

時間複雜度: 最好:o(n^2)       平均:o(n^2)        最壞:o(n^2)

堆排序:

時間複雜度:最好:o(nlog2n)    平均:o(nlog2n)   最壞: o(nlog2n)

兩者空間複雜度均為o(1) 

選擇排序 直接選擇排序,堆排序

選擇排序 selection sort 是一種簡單直觀的 排序演算法 它的工作原理是每一次從待排序的 資料元素 中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 1.簡單的選擇排序 基本思想 在要排序的一組數中,選出最小的乙個數與第乙個位...

選擇排序 直接選擇排序 堆排序

1.基本思想 每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完 在元素集合array i array n 1 中選擇關鍵碼最大 小 的資料元素 若它不是這組元素中的最後乙個 第乙個 元素,則將它與這組元素中的最後乙個 第乙個 元素交換 在剩餘...

選擇排序(直接選擇排序 堆排序)

選擇排序的基本方法 每次都從待排序物件中選出排序碼最大或最小的物件,依次排列,一共進行n 1次即可將n個物件排序完成。選擇排序的實施方案 1.直接選擇排序 2.堆排序 一 直接選擇排序 1.演算法 直接選擇排序 func selectsort data int if minindex i 2.時間複...