0. 简介
选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。
1. 选择排序的实现
选择排序的基本思想:
- 在未排序的序列中找到最小(或最大)的元素,存放到排序序列的起始位置。
- 再从剩余未排序的元素中继续寻找最小(或最大)的元素,然后放到已排序的序列的末尾。
- 以此类推,直到所有元素均排序完毕。
选择排序过程演示:
2. 选择排序时空间复杂度分析
选择排序的时间复杂度和空间复杂度如下:
-
时间复杂度:
- 无论数据状况如何,选择排序都需要进行 n-1 趟选择,每趟选择都需要进行 n-i 次比较(i 是当前趟数),所以总的时间复杂度是 O(n^2)。
-
空间复杂度:
- 选择排序是原地排序,只需要一个额外空间用于临时交换元素,所以空间复杂度是 O(1)。
总结:选择排序的时间复杂度是 O(n^2),空间复杂度是 O(1)。
3. 选择排序C语言代码
C代码实现:
#include <stdio.h>
void selectionSort(int arr[], int n) {
int i, j, minIndex, temp;
for (i = 0; i < n-1; i++) { // 外层循环控制选择的趟数
minIndex = i; // 记录最小值的索引,初始化为当前趟的起始位置
for (j = i+1; j < n; j++) { // 内层循环在未排序的元素中查找最小值
if (arr[j] < arr[minIndex]) {
minIndex = j; // 更新最小值的索引
}
}
// 交换找到的最小值与当前趟的起始位置的值
temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90}; // 待排序的数组
int n = sizeof(arr)/sizeof(arr[0]); // 数组的长度
selectionSort(arr, n); // 对数组进行选择排序
printf("Sorted array: \n");
for (int i=0; i < n; i++) { // 输出排序后的数组
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
代码解释:
selectionSort
函数接收一个整数数组和它的长度作为参数。- 外层循环负责保证选择的趟数。例如,有7个数字,就需要选择6趟。
- 内层循环负责在未排序的元素中查找最小值。
minIndex
用于记录当前找到的最小值的索引,初始化为当前趟的起始位置。如果发现有更小的数,就更新minIndex
。 - 内层循环结束后,我们已经找到了当前未排序部分的最小值,然后将其与当前趟的起始位置的值进行交换。这样,当前趟的起始位置就有了正确的值。
- 外层循环继续进行,直到所有元素都排好序。
4. 选择排序代码运行结果
代码运行结果: