概念
以下排序是基于 升序 的,即 从小到大 排序
选择排序就是 每次选取最小的那个元素,并把它与第一个元素交换,简而言之,就是 把最小的元素不断的推到左边
伪代码
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
浙公网安备 33010602011771号