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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
| #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h>
int linear_search(const int arr[], int size, int target) { for (int i = 0; i < size; i++) { if (arr[i] == target) { return i; } } return -1; }
int binary_search(const int arr[], int size, int target) { int left = 0, right = size - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid; } else if (arr[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; }
void quick_sort(int arr[], int low, int high) { if (low < high) { int pivot = partition(arr, low, high); quick_sort(arr, low, pivot - 1); quick_sort(arr, pivot + 1, high); } }
int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] <= pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return i + 1; }
void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; }
void merge_sort(int arr[], int temp[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; merge_sort(arr, temp, left, mid); merge_sort(arr, temp, mid + 1, right); merge(arr, temp, left, mid, right); } }
void merge(int arr[], int temp[], int left, int mid, int right) { for (int i = left; i <= right; i++) { temp[i] = arr[i]; } int i = left, j = mid + 1, k = left; while (i <= mid && j <= right) { if (temp[i] <= temp[j]) { arr[k++] = temp[i++]; } else { arr[k++] = temp[j++]; } } while (i <= mid) { arr[k++] = temp[i++]; } while (j <= right) { arr[k++] = temp[j++]; } }
typedef struct { int min; int max; double average; int sum; } ArrayStats;
ArrayStats calculate_stats(const int arr[], int size) { ArrayStats stats = {arr[0], arr[0], 0.0, 0}; for (int i = 0; i < size; i++) { if (arr[i] < stats.min) stats.min = arr[i]; if (arr[i] > stats.max) stats.max = arr[i]; stats.sum += arr[i]; } stats.average = (double)stats.sum / size; return stats; }
void performance_test(void) { printf("=== 数组算法性能测试 ===\n"); const int size = 100000; int* arr = malloc(size * sizeof(int)); int* temp = malloc(size * sizeof(int)); if (arr == NULL || temp == NULL) { printf("内存分配失败\n"); return; } srand((unsigned int)time(NULL)); for (int i = 0; i < size; i++) { arr[i] = rand() % 10000; } clock_t start = clock(); int target = arr[size / 2]; int index = linear_search(arr, size, target); clock_t end = clock(); printf("线性搜索: 找到索引 %d, 耗时 %.2f ms\n", index, ((double)(end - start) / CLOCKS_PER_SEC) * 1000); int* sorted_arr = malloc(size * sizeof(int)); memcpy(sorted_arr, arr, size * sizeof(int)); start = clock(); merge_sort(sorted_arr, temp, 0, size - 1); end = clock(); printf("归并排序: 耗时 %.2f ms\n", ((double)(end - start) / CLOCKS_PER_SEC) * 1000); start = clock(); index = binary_search(sorted_arr, size, target); end = clock(); printf("二分搜索: 找到索引 %d, 耗时 %.2f ms\n", index, ((double)(end - start) / CLOCKS_PER_SEC) * 1000); ArrayStats stats = calculate_stats(arr, size); printf("\n数组统计信息:\n"); printf("最小值: %d\n", stats.min); printf("最大值: %d\n", stats.max); printf("平均值: %.2f\n", stats.average); printf("总和: %d\n", stats.sum); free(arr); free(temp); free(sorted_arr); }
int main(void) { performance_test(); return 0; }
|