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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
| #include <stdio.h> #include <stdlib.h> #include <string.h>
void swap(int *a, int *b) { int t = *a; *a = *b; *b = t; }
void printArr(int *arr, int n) { for (int i = 0; i < n; i++) printf("%d ", arr[i]); printf("\n"); }
// ============ 冒泡排序 ============ void bubbleSort(int *arr, int n) { for (int i = 0; i < n - 1; i++) { bool swapped = false; for (int j = 0; j < n - 1 - i; j++) { if (arr[j] > arr[j+1]) { swap(&arr[j], &arr[j+1]); swapped = true; } } if (!swapped) break; // 已经有序 } }
// ============ 选择排序 ============ void selectionSort(int *arr, int n) { for (int i = 0; i < n - 1; i++) { int minIdx = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIdx]) minIdx = j; } swap(&arr[i], &arr[minIdx]); } }
// ============ 插入排序 ============ void insertionSort(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 } arr[j+1] = key; } }
// ============ 归并排序 ============ void mergeSortHelper(int *arr, int *temp, int left, int right) { if (left >= right) return; int mid = left + (right - left) / 2; mergeSortHelper(arr, temp, left, mid); mergeSortHelper(arr, temp, mid + 1, right); // 合并 int i = left, j = mid + 1, k = left; while (i <= mid && j <= right) { if (arr[i] <= arr[j]) temp[k++] = arr[i++]; else temp[k++] = arr[j++]; } while (i <= mid) temp[k++] = arr[i++]; while (j <= right) temp[k++] = arr[j++]; memcpy(arr + left, temp + left, sizeof(int) * (right - left + 1)); }
void mergeSort(int *arr, int n) { int *temp = (int*)malloc(sizeof(int) * n); mergeSortHelper(arr, temp, 0, n - 1); free(temp); }
// ============ 快速排序 ============ int partitionQS(int *arr, int left, int right) { // 随机选择pivot避免最坏情况 int randIdx = left + rand() % (right - left + 1); swap(&arr[randIdx], &arr[right]); int pivot = arr[right]; int i = left; for (int j = left; j < right; j++) { if (arr[j] < pivot) { swap(&arr[i], &arr[j]); i++; } } swap(&arr[i], &arr[right]); return i; }
void quickSortHelper(int *arr, int left, int right) { if (left >= right) return; int pivot = partitionQS(arr, left, right); quickSortHelper(arr, left, pivot - 1); quickSortHelper(arr, pivot + 1, right); }
void quickSort(int *arr, int n) { quickSortHelper(arr, 0, n - 1); }
// ============ 堆排序 ============ void heapify(int *arr, int n, int i) { int largest = i; int left = 2*i + 1, right = 2*i + 2; if (left < n && arr[left] > arr[largest]) largest = left; if (right < n && arr[right] > arr[largest]) largest = right; if (largest != i) { swap(&arr[i], &arr[largest]); heapify(arr, n, largest); } }
void heapSort(int *arr, int n) { // 建堆 for (int i = n/2 - 1; i >= 0; i heapify(arr, n, i); } // 逐步取出最大值 for (int i = n - 1; i > 0; i swap(&arr[0], &arr[i]); heapify(arr, i, 0); } }
int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr) / sizeof(arr[0]); int temp[7]; memcpy(temp, arr, sizeof(arr)); quickSort(temp, n); printf("快速排序: "); printArr(temp, n); memcpy(temp, arr, sizeof(arr)); mergeSort(temp, n); printf("归并排序: "); printArr(temp, n); memcpy(temp, arr, sizeof(arr)); heapSort(temp, n); printf("堆排序: "); printArr(temp, n); return 0; }
|