1基本思想:
每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的 數據元素排完 。
2 直接選擇排序:
在元素集合 array[i]--array[n-1] 中選擇關鍵碼最大 ( 小 ) 的數據元素。若它不是這組元素中的最后一個 ( 第一個 ) 元素,則將它與這組元素中的最后一個(第一個)元素交換。在剩余的 array[i]--array[n-2] ( array[i+1]--array[n-1] )集合中,重復上述步驟,直到集合剩余 1 個元素。
選擇排序的單趟就是找出最大的值的下標maxi和最小值的下標mini,然后將最小值放在最左邊,最大值放在最右邊。首先寫一個單趟,maxi和mini都在同一個位置(最左邊),然后寫一個for循環,下標i用來遍歷數組,i的起始位置是begin+1,結束條件是i>end,進入循環開始找最大值和最小值的下標,循環結束意味著maxi和mini已經到了相應的位置,就可以開始交換值了,交換完最小值后要注意一下,如果maxi一直是begin這個位置,那么就已經被換走了,換到了a[mini]這個位置,所以要修正一下,將maxi=mini,再交換最大值。那么單趟走完之后begin++,end--,每次進入循環maxi和mini都在begin這個位置,所以最外層套一個while循環,結束條件是begin>=end。
?
//選擇排序
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin + 1; i <= end; i++){//更新最大/小值的的下標if (a[i] > a[maxi]){maxi = i;}if (a[i] < a[mini]){mini = i;}}Swap(&a[begin], &a[mini]);if (maxi == begin){maxi = mini;}Swap(&a[end], &a[maxi]);begin++;end--;}
}
直接選擇排序的特性總結:
1. 直接選擇排序思考非常好理解,但是效率不是很好。實際中很少使用2. 時間復雜度: O(N^2)3. 空間復雜度: O(1)4. 穩定性:不穩定
3 堆排序
堆排序 (Heapsort) 是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的一種。它是 通過堆來進行選擇數據。需要注意的是排升序要建大堆,排降序建小堆。
堆排序在前面的一篇文章中有詳細介紹:
http://t.csdnimg.cn/S4Yso
http://t.csdnimg.cn/S4Yso

1. 堆排序使用堆來選數,效率就高了很多。2. 時間復雜度: O(N*logN)3. 空間復雜度: O(1)4. 穩定性:不穩定
今天的分享到這里就結束了,感謝大家的閱讀!