選擇排序即每次從待排序的數列中選擇乙個最小的元素,然後把它放在已排好序列的最前面(假定這裡從小到大排序),直至序列完全有序。
選擇排序分為線性結構的直接選擇排序與非線性的堆排序,後者是用相當於把樹的元素存在陣列中,通過元素下標來區分孩子結點與父親結點等等
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.時間複...