一、基本思想
每次從待排記錄中選出最小值放在有序記錄的末尾。等每乙個待排元素均被選出後,整個記錄排序就完成了。
二、實現步驟
這裡採用雙向選擇排序,每次從待排記錄中選出最大值和最小值,最大值和待排記錄的最後一位交換位置,最小值和待排記錄的第一位交換位置。
注意,交換位置分如下情況:
1)最大值在最左邊,最小值在最右邊。直接將最大值最小值相互交換即可。
2)最大值在最左邊,最小值在中間。必須先將最大值與最後一位交換,再將最小值與第一位交換。否則會出錯,不信就試試。
3)最大值在中間,最小值在中間。隨意誰先交換都行。
4)最小值在最右邊,最大值在中間。必須先將最小值與第一位交換,再將最大值與最後一位交換。
5)最小值在最右邊,最大值在最左邊。不用交換。
對於上述5種情況,其實可以簡化成如下情況來做。
一、如果max在最左邊,
如果min在最右邊,兩者直接交換
否則,先交換max,再交換min
二、其他情況一律先交換min,再交換max。
max在最左,min在最右這種情況,由於兩次交換,等同於沒交換,所以不會出現錯誤。
三、實現**
測試工具類 點選這裡
package測試結果:sort;
import sort.util.*;
/*選擇排序思路:
選擇待排記錄中最小值,放在左邊
雙向選擇,一次遍歷中選出最大值放在右邊,選出最小值放在左邊
時間複雜度:o(n2)
空間複雜度:o(1)
穩定性: 穩定
*/public
class selectsort implements
isort
if(a[j] < a[minid])
}//根據maxid的位置走不同的交換順序
int t = 0;
if(maxid ==i)else
}else}}
public
static
void
main(string args)
}
四、總結分析
時間複雜度:o(n2)
空間複雜度:o(1)
選擇排序是一種比較直觀易懂的排序演算法,時間複雜度不理想,但幾乎不佔空間。下篇將展示選擇排序的改進演算法 ----- 堆排序。
八大排序之選擇排序
個人部落格 建議先看排序綜述,傳送門 資料結構與演算法系列之一 八大排序綜述。選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小 大 元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小 大 元素,然後放到已排序序列的末...
八大排序之選擇排序
思想 每一趟都從待排序的數列中選擇乙個最大 最小 的,放在數列的最後乙個位置 或起始位置 直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法。例 9 5 3 4 6 2 8 1 7 0 if maxpos len 1 i 如果最大的元素就是在最後位置,就不用交換 int main int le...
八大排序之選擇排序
每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小 大 元素,然後放到已排序序列的末尾。以此類推,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法。每次掃瞄找到最小,到掃瞄到末尾,將本次掃瞄的最小放到左邊 注意與氣泡排序相比較...