排序演算法3---選擇排序
阿新 • • 發佈:2018-11-09
選擇排序
基本思想:每一趟(例如第i趟,i=0,1,…,n-2)在後面n-i個待排序的資料元素集合中選出關鍵碼最小的資料元素,作為有序元素序列的第i個元素,待到第n-2趟做完,待排序元素集合中只剩 下1個元素,排序結束。
時間複雜度: O(n^2)
空間複雜度: O(1)
穩 定 性 :不穩定
適用場景:資料量較小,交換次數比較少
我們首先來看第一個版本
選擇排序(單邊縮小空間)
基本思想:我們定義一個maxIndex來標記區間內最大值的下標,第一次遍歷完陣列後,更新maxIndex的指向,與下標為end(最後一個元素)的元素交換,end–縮小空間,繼續遍歷更新maxIndex。
程式碼:
void SelectSort(int* arr, int size)
{
if (arr == NULL || size <= 0)
return;
for (int end = size - 1; end > 0; --end)
{
int maxIndex = end;//最大下標
for (int idx = 0; idx < end; ++idx)
{
//比最大的元素還大,更新最大下標
if (arr[idx] > arr[maxIndex])
maxIndex = idx;
}
//交換end與最大元素的值
std::swap(arr[maxIndex], arr[end]);
}
}
這個演算法還可以優化,我下個部落格再寫。