1.基本思想
每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完 。
2.直接選擇排序
- 在元素集合array[i]--array[n-1]中選擇關鍵碼最大(小)的數據元素
- 若它不是這組元素中的最后一個(第一個)元素,則將它與這組元素中的最后一個(第一個)元素交換
- 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重復上述步驟,直到集合剩余1個元素
直接選擇排序動圖:https://pic1.zhimg.com/v2-1c7e20f306ddc02eb4e3a50fa7817ff4_b.webp
3.直接選擇排序的特性總結
- 直接選擇排序思考非常好理解,但是效率不是很好。實際中很少使用
- 時間復雜度:O(N^2)
- 空間復雜度:O(1)
- 穩定性:不穩定
4.實現思路
我們在這個思想上再優化一步,一次遍歷選出兩個數,最大的maxi和最小的mini
遍歷n/2遍數組,找到最小的值和左邊換,找到最大的值和右邊換,每遍歷一次范圍就縮小2
如果遍歷之后最大的還是在begin位置,當swap一次之后,maxi已經換到了mini的位置,需要更新 一下maxi的位置
5.代碼示例
void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin; i <= end; i++){if (a[i] < a[mini])mini = i;if (a[i] > a[maxi])maxi = i;}Swap(&a[begin], &a[mini]);if (maxi == begin)maxi = mini;Swap(&a[end], &a[maxi]);begin++;end--;}
}