圖片源于網絡
選擇排序
選擇排序(Selection Sort)是一種簡單直觀的排序算法.每趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排序的記錄序列末尾,直到全部排序結束為止。
算法思想
- 設數組內存放了n個待排數字,數組下標從1開始,到n結束。
- 從數組的第i個元素開始到第n個元素,尋找最小的元素。(具體過程為:先設arr[i]為最小,逐一比較,若遇到比之小的則交換)
- 將上一步找到的最小元素和第i位元素交換。
- 如果i=n-1算法結束,否則重復"從數組的第i個元素開始到第n個元素,尋找最小的元素"的過程
圖-選擇排序示例圖
如圖所示,每趟排序中,將當前第 i 小的元素放在位置 i 上。
范例代碼
/**
選擇排序
@param array 需要排序的Array
*/
+ (void)selectSort:(NSMutableArray *)array{
//遍歷數組
/*
選擇排序的原理:每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。
//排序數組
NSMutableArray *originalArray =
[NSMutableArray arrayWithObjects:@9,@1,@2,@5,@7,@4,@8,@6,@3,@5,nil];
*/
NSInteger min = 0;
for (int i=0; i<array.count; i++) {
//先設數組最小值下標為i;
min = i;
for (int j=i+1; j<array.count; j++) {
//待排序數組array[j] < array[min] 其最小值的下標為j
if (array[j]<array[min]) {
min = j;
}
}
//交換數據
if (min != i) {
[array exchangeObjectAtIndex:i withObjectAtIndex:min];
}
}
NSLog(@"選擇排序:%@",array);
}
算法分析
-
選擇排序算法的性能
選擇排序算法的性能
-
時間復雜度
選擇排序的比較次數與序列的初始排序無關。 假設待排序的序列有 n 個元素,則比較次數總是[n *(n - 1)] / 2。
而移動次數與序列的初始排序有關。當序列正序時,移動次數最少,為 0。當序列反序時,移動次數最多,為[3n *(n - 1) ]/ 2。選擇排序的最優時間復雜度和最差時間復雜度和平均時間復雜度都為 :O(n^2) -
空間復雜度
空間復雜度,最優的情況下(已經有順序)復雜度為:O(0) ;最差的情況下(全部元素都要重新排序)復雜度為:O(n );平均的時間復雜度:O(1)
-
算法穩定性
選擇排序是不穩定的排序方法。(如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5后面)。
冒泡排序與選擇排序的區別
冒泡排序在內循環交換,選擇排序在外循環交換
-
效率差也就在這個交換次數上,畢竟O(n)<O(n^2)。
冒泡排序算法:每次比較如果發現較小的元素在后面,就交換兩個相鄰的元素。
選擇排序算法:先并不急于調換位置,先從A[1]開始逐個檢查,看哪個數最小就記下該數所在的位置P,等一躺掃描完畢,再把A[P]和A[1]對調,這時A[1]到A[10]中最小的數據就換到了最前面的位置。
注意:
如果數組完全有序,冒泡內循環的交換一次都不會執行,而選擇排序每次還要和本身交換一次,此時冒泡效率高。但這種情況極少,所以僅從算法的角度看,選擇優于冒泡