1. 程式人生 > 實用技巧 >簡單選擇排序

簡單選擇排序

簡單選擇排序是選擇排序的一種,下面是選擇排序的一些特徵:

  • 時間複雜度,最好最壞平均都為:O(n^2)
  • 空間複雜度,最好最壞平均都為:O(1)
  • 是否穩定:不穩定

每次排序都將一個元素放到最總位置上,第k次排序,放第k大的元素到最終位置上

簡單選擇排序的基本思想:每次選擇剩餘元素中最小(大)的元素放到排好的序列最後(前),知道剩餘元素為0。

下面是簡單選擇排序的程式碼:

/**
* arr 陣列首地址
* len 陣列長度
*/
void select_sort(int *arr, int len)
{
    int i, j;
    for (i=0; i<len-1; i++) {   // 把len個元素中較小的len-1個元素排好序後,那len個元素就排好序了
        int min = i;
        for (j=i+1; j<len; j++)
            if (arr[j]<arr[min])
                min = j;
        if (min!=i)
            swap(arr+i, arr+min);   // 交換兩個元素的位置
    }
}

測試程式碼,可直接複製後編譯執行:

#include <stdio.h>

void show(int *arr, int len);
void select_sort(int *arr, int len);
void swap(int *px, int *py);

int main()
{
    int len = 7;
    int arr[] = {7, 10, 11, 9, -8, 2, 27};
    select_sort(arr, len);
    show(arr, len);
    return 0;
}

/**
* 交換兩個元素的值
*/
void swap(int *px, int *py)
{
    int temp = *px;
    *px = *py;
    *py = temp;
}

/**
* arr 陣列首地址
* len 陣列長度
*/
void show(int *arr, int len)
{
    int i;
    for (i=0; i<len; i++) {
        printf("%4d", arr[i]);
    }
    printf("\n");
}

/**
* arr 陣列首地址
* len 陣列長度
*/
void select_sort(int *arr, int len)
{
    int i, j;
    for (i=0; i<len-1; i++) {   // 把len個元素中較小的len-1個元素排好序後,那len個元素就排好序了
        int min = i;
        for (j=i+1; j<len; j++)
            if (arr[j]<arr[min])
                min = j;
        if (min!=i)
            swap(arr+i, arr+min);   // 交換兩個元素的位置
    }
}