算法稳定性是指排序算法在排序过程中,具有相同关键字的记录相对次序不会发生改变的特性。如果一个排序算法是稳定的,那么对于任意两个记录 ri 和 rj,如果它们在原序列中满足 ri < rj,则在排序后的序列中 ri 仍然小于 rj。
冒泡排序(Bubble Sort) 稳定性
:稳定
实现 ```c void bubble_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换 arr[j] 和 arr[j + 1] int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ```选择排序(Selection Sort)
稳定性:不稳定
实现 ```c void selection_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int min_idx = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[min_idx]) { min_idx = j; } } // 交换 arr[i] 和 arr[min_idx] int temp = arr[i]; arr[i] = arr[min_idx]; arr[min_idx] = temp; } } ```插入排序(Insertion Sort)
稳定性:稳定
实现 ```c void insertion_sort(int arr[], int n) { for (int i = 1; i < n; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j = j - 1; } arr[j + 1] = key; } } ```归并排序(Merge Sort)
稳定性:稳定
实现 ```c void merge_sort(int arr[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; merge_sort(arr, left, mid); merge_sort(arr, mid + 1, right); merge(arr, left, mid, right); } } void merge(int arr[], int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid; int L[n1], R[n2]; for (int i = 0; i < n1; i++) L[i] = arr[left + i]; for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; int i = 0, j = 0, k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } ```快速排序(Quick Sort)
稳定性:不稳定
实现