- 問題:給定一個整數序列,按照從小到大的順序(確切地說,是非遞減的順序)排列序列中的整數。
 - 輸入:一個整數序列。
 - 輸出:整數序列,其中的整數升序排列。
 
選擇排序的思想:選出最小的一個和第一個位置交換,選出其次小的和第二個位置交換 ……
 直到從第N個和第N-1個元素中選出最小的放在第N-1個位置。
選擇排序的C語言實現如下:
void sel_sort(int *a, size_t size)
{
    int i, j;
    int min_index;
    int t;
    for(i = 0; i < size - 1; i ++){
        min_index = i;
        for( j = i + 1; j < size; j++){
            if(a[j] < a[min_index])
                min_index = j;
        }
        if (min_index != i){
            t = a[i];
            a[i] = a[min_index];
            a[min_index] = t;
        }
    }
}
 
        選擇排序的Python實現如下:
def selection_sort(int_list):
    l = len(int_list)
    for i in range(0, l - 1):
        min = i
        for j in range(i + 1, l):
            if int_list[j] < int_list[min]:
                min = j
        if i != min:
            t = int_list[i]
            int_list[i] = int_list[min]
            int_list[min] = t
 
         
         
        選擇排序的復雜度分析。第一次內循環比較N - 1次,然后是N-2次,N-3次,……,最后一次內循環比較1次。
 共比較的次數是 (N - 1) + (N - 2) + ... + 1,求等差數列和,得 (N - 1 + 1)* N / 2 = N^2 / 2。
 舍去最高項系數,其時間復雜度為 O(N^2)。
雖然選擇排序和冒泡排序的時間復雜度一樣,但實際上,選擇排序進行的交換操作很少,最多會發生 N - 1次交換。
 而冒泡排序最壞的情況下要發生N^2 /2交換操作。從這個意義上講,交換排序的性能略優於冒泡排序。
 而且,交換排序比冒泡排序的思想更加直觀。
2015-03-18 Wed
本系列文章(更新中):
