簡介
選擇排序(selection sort)是一種簡單直觀的排序演算法。它的工作原理是:第一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的資料元素的個數為零。選擇排序是不穩定的排序方法。
時間複雜度
選擇排序時間複雜度為: o(n^2)
選擇排序的交換操作介於 0 和 (n - 1) 次之間。選擇排序的比較操作為 n (n - 1) / 2 次之間。選擇排序的賦值操作介於 0 和 3 (n - 1) 次之間。
比較次數o(n^2),比較次數與關鍵字的初始狀態無關,總的比較次數n=(n-1)+(n-2)+…+1=n*(n-1)/2。交換次數o(n),最好情況是,已經有序,交換0次;最壞情況交換n-1次,逆序交換n/2次。交換次數比氣泡排序少多了,由於交換所需cpu時間比比較所需的cpu時間多,n值較小時,選擇排序比氣泡排序快。
空間複雜度
由於選擇排序不需要額外的空間,所以空間複雜度為: o(1)
穩定性選擇排序是給每個位置選擇當前元素最小的,比如給第乙個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它乙個最大的元素了。那麼,在一趟選擇,如果乙個元素比當前元素小,而該小的元素又出現在乙個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是乙個不穩定的排序演算法。
/**
* 選擇排序 最簡單也是最沒用的排序演算法 並且不穩定
* 效率底下 執行耗時長 記憶體消耗低
*/public
class
selectionsort
//選擇排序演算法優化 【每次選出最大值與 最小值】
public
static
int[
]sortseo
(int
arr)
for(
int j = i+
1; j < length - i -
1; j++)if
(minindex == i && maxindex == length - i -1)
else
if(minindex == i && maxindex != length - i -1)
else
if(minindex != i && maxindex == length - i -1)
else
else}}
return arr;
}//基礎選擇排序【每次選出最小值】
public
static
int[
]sortbasics
(int
arr)
swap
(arr, i, minindex);}
system.out.
println
("共進行: "
+maxcount+
"次大迴圈,: "
+mincount+
"次小迴圈");
return arr;
}public
static
void
swap
(int
arr,
int i,
int j)
//列印int陣列
public
static
void
print
(int
arr)
}}
排序演算法 基本選擇排序
選擇排序是一種簡單直觀的排序演算法,基本思想是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。n個元素的數列,需要n 1趟直接排序。拿第1個元素,依次與後面的其他元素逐個比較,找出最小 最大 的元素,放到下標為0的位置。經過第1步,數列的第...
基本排序演算法 選擇排序
排序方式 選擇排序 表現最穩定的排序演算法之一 這個穩定不是指演算法層面上的穩定 因為無論什麼資料進去都是o n 的時間複雜度 所以用到它的時候,資料規模越小越好。唯一的好處可能就是不占用額外的記憶體空間了吧。理論上講,選擇排序可能也是平時排序一般人想到的最多的排序方法了吧。原理首先從原始陣列中找到...
選擇排序演算法改進隨筆
選擇排序演算法改進隨筆 這是一道選擇排序改進的小測試,想法,在一次遍歷中直接選取出最大值和最小值,然後分別移動到頭尾,主要難點在於邊界的處理,因為使用了兩次swap,第一次使用swap會造成index變化,第二次使用swap的時候就需要注意。主要是兩種情況 當最大值出現在頭,或者最大值出現在頭,最小...