选择排序(Selection Sort)是一种简单直观的排序算法。它的主要思想是每次从未排序的部分中选择最小(或最大)的元素,放到已排序部分的末尾,直到所有元素都已排序。选择排序的时间复杂度是 (O(n^2)),其中 (n) 是数组的长度,因此在大多数情况下,选择排序并不适用于处理大规模的数据。
选择排序的步骤
- 从未排序部分中找到最小(或最大)的元素。
- 将该元素与未排序部分的第一个元素交换位置。
- 重复上述步骤,直到所有元素都已排序。
选择排序的优缺点
优点
- 简单易懂,容易实现。
- 不需要额外的存储空间,是一种原地排序算法(in-place sort)。
缺点
- 时间复杂度高,为 (O(n^2)),不适合大型数据集。
- 无论输入数据是否有序,执行时间都是一样的,没有利用已有的有序信息。
C 语言实现选择排序
#include <stdio.h>
// 函数声明
void selectionSort(int arr[], int n);
void swap(int *xp, int *yp);
void printArray(int arr[], int size);
int main() {
int arr[] = {64, 25, 12, 22, 11};
int n = sizeof(arr) / sizeof(arr[0]);
printf("未排序的数组: \n");
printArray(arr, n);
selectionSort(arr, n);
printf("排序后的数组: \n");
printArray(arr, n);
return 0;
}
// 选择排序函数
void selectionSort(int arr[], int n) {
int i, j, min_idx;
// 一一遍历数组
for (i = 0; i < n-1; i++) {
// 将当前下标设为最小值下标
min_idx = i;
// 在未排序部分找到最小值的下标
for (j = i+1; j < n; j++) {
if (arr[j] < arr[min_idx]) {
min_idx = j;
}
}
// 将最小值与未排序部分的第一个元素交换位置
swap(&arr[min_idx], &arr[i]);
}
}
// 交换两个整数值的函数
void swap(int *xp, int *yp) {
int temp = *xp;
*xp = *yp;
*yp = temp;
}
// 打印数组的函数
void printArray(int arr[], int size) {
int i;
for (i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
代码解释
-
函数声明:
selectionSort(int arr[], int n)
:排序函数,参数是数组和数组长度。swap(int *xp, int *yp)
:交换函数,用于交换两个整数的值。printArray(int arr[], int size)
:打印数组函数,用于输出数组的内容。
-
main
函数:- 初始化一个数组
arr
,并计算其长度n
。 - 打印未排序的数组。
- 调用
selectionSort
函数进行排序。 - 打印排序后的数组。
- 初始化一个数组
-
selectionSort
函数:- 遍历数组,每次找到未排序部分的最小值,将其与未排序部分的第一个元素交换。
- 使用内嵌循环来查找最小值的下标
min_idx
。
-
swap
函数:- 使用指针交换两个整数的值。
-
printArray
函数:- 遍历数组并打印每个元素。