概念

以下排序是基于 升序 的,即 从小到大 排序

选择排序就是 每次选取最小的那个元素,并把它与第一个元素交换,简而言之,就是 把最小的元素不断的推到左边

伪代码

min_idx <- 0 // 初始化最小值的索引
for i <- 0 to n - 2 do // 只对array[i:]的元素排序,array[:i]是排序好的
  for j <- i to n - 1 do // 寻找最小的元素,并存储它的索引
    if array[min_idx] > array[j] then
      min_idx <- j
  swap(min_idx, i) // 将最小元素和第一个元素交换

时间复杂度为 O(n^2)

代码实现

C

#include <stdio.h>

static void selection_sort(int arr[], size_t size)
{
    int min_idx = 0;
    for (size_t i = 0; i < size - 1; i++) {
        for (size_t j = i; j < size; j++) {
            if (arr[min_idx] > arr[j]) {
                min_idx = j;
            }
        }
        /* swap */
        int tmp = arr[i];
        arr[i] = arr[min_idx];
        arr[min_idx] = tmp;
    }
}

static void print(int arr[], size_t size)
{
    for (size_t i = 0; i < size; i++)
        printf(" %d", arr[i]);
    printf("\n");
}

int main(void)
{
    int arr[] = {4, 5, 7, -1, 2, 4, 0};
    size_t size = sizeof(arr) / sizeof(arr[0]);
    print(arr, size);

    selection_sort(arr, size);
    print(arr, size);

    return 0;
}

Lua

local function selection_sort(arr)
    local min_idx = 1
    for i = 1, #arr - 1, 1 do
        for j = i, #arr, 1 do
            if arr[min_idx] > arr[j] then
                min_idx = j
            end
        end
        -- swap
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    end
end

local function print(arr)
    for _, v in ipairs(arr) do
        io.write(" " .. tostring(v))
    end
    io.write("\n")
end

local function run()
    local arr = {9, 4, 5, 7, -2, -1, 0}
    print(arr)

    selection_sort(arr)
    print(arr)
end

run()
 posted on 2025-03-10 14:22  Dylaris  阅读(8)  评论(0)    收藏  举报