算法原理
选择排序(Selection Sort)是一种简单直观的比较排序算法。它的工作原理是每次从待排序的数据元素中选择最小(或最大)的一个元素,放到序列的起始位置,然后再从剩余的未排序元素中寻找最小(或最大)元素,继续这个过程直到所有元素排序完毕。
基本思想
- 找到最小值:在未排序序列中找到最小元素
- 交换位置:将最小元素与序列第一个元素交换
- 缩小范围:在剩余未排序元素中重复上述步骤
- 完成排序:直到所有元素都排序完成
C语言实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| #include <stdio.h> #include <stdlib.h>
void selection_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int min_index = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[min_index]) { min_index = j; } } if (min_index != i) { int temp = arr[i]; arr[i] = arr[min_index]; arr[min_index] = temp; } } }
void bidirectional_selection_sort(int arr[], int n) { int left = 0, right = n - 1; while (left < right) { int min_index = left, max_index = left; for (int i = left; i <= right; i++) { if (arr[i] < arr[min_index]) { min_index = i; } if (arr[i] > arr[max_index]) { max_index = i; } } if (min_index != left) { int temp = arr[left]; arr[left] = arr[min_index]; arr[min_index] = temp; if (max_index == left) { max_index = min_index; } } if (max_index != right) { int temp = arr[right]; arr[right] = arr[max_index]; arr[max_index] = temp; } left++; right--; } }
int main() { int arr[] = {64, 25, 12, 22, 11}; int n = sizeof(arr) / sizeof(arr[0]); printf("原数组: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); selection_sort(arr, n); printf("排序后: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
|
复杂度分析
- 时间复杂度:O(n²) - 所有情况
- 空间复杂度:O(1) - 原地排序
- 稳定性:不稳定
优缺点
优点
- 实现简单,代码量少
- 原地排序,空间复杂度低
- 交换次数少,最多n-1次
缺点
- 时间复杂度高,不适合大数据量
- 不稳定,相等元素可能改变相对位置
- 不是自适应的,最好最坏情况时间复杂度相同
版权所有,如有侵权请联系我