#include #include #include #ifdef _WIN32 #include #include #endif #define NUM_COUNT 10000 #define INPUT_FILE "random_numbers.txt" #define OUTPUT_FILE "sorted_numbers.txt" /* 选择排序函数 */ void SelectSort(int arr[], int n) { int i, j, minIndex, temp; for (i = 0; i < n - 1; i++) { // 假设当前索引i的元素为最小值 minIndex = i; for (j = i + 1; j < n; j++) { // 在未排序部分查找更小元素 if (arr[j] < arr[minIndex]) { // 更新最小值的索引 minIndex = j; } } // 将找到的最小值与当前位置交换 if (minIndex != i) { temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } } /* 生成随机数并写入文件 */ void MakeRandomNumber(const char *filename) { FILE *file = fopen(filename, "w"); if (file == NULL) { printf("错误:无法创建文件 %s\n", filename); exit(1); } // 初始化随机数种子 srand((unsigned int)time(NULL)); for (int i = 0; i < NUM_COUNT; i++) { // 生成0-99999范围内的随机数 fprintf(file, "%d\n", rand() % 100000); } fclose(file); printf("已生成 %d 个随机数到文件 %s\n", NUM_COUNT, filename); } /* 从文件读取数字到数组 */ int ReadNumbers(const char *filename, int arr[]) { FILE *file = fopen(filename, "r"); if (file == NULL) { printf("错误:无法打开文件 %s\n", filename); exit(1); } int count = 0; while (fscanf(file, "%d", &arr[count]) != EOF && count < NUM_COUNT) { count++; } fclose(file); printf("已从文件 %s 读取 %d 个数字\n", filename, count); return count; } /* 将数组中的数字写入文件 */ void writeNumbersToFile(const char *filename, int arr[], int n) { FILE *file = fopen(filename, "w"); if (file == NULL) { printf("错误:无法创建文件 %s\n", filename); exit(1); } for (int i = 0; i < n; i++) { fprintf(file, "%d\n", arr[i]); } fclose(file); printf("已将 %d 个排序后的数字写入文件 %s\n", n, filename); } int main() { // 设置控制台编码为UTF-8,防止中文乱码 #ifdef _WIN32 system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 SetConsoleOutputCP(65001); // 设置控制台输出编码 SetConsoleCP(65001); // 设置控制台输入编码 _mkdir("records"); #endif int numbers[NUM_COUNT]; int actual_count; clock_t start, end; double time_used; printf("=== 选择排序执行时间测量程序 ===\n"); // 生成随机数并写入文件 printf("\n1. 生成随机数...\n"); MakeRandomNumber(INPUT_FILE); // 从文件读取数字到数组 printf("\n2. 读取文件...\n"); actual_count = ReadNumbers(INPUT_FILE, numbers); // 显示部分未排序数据 printf("\n3. 未排序数据(前10个): "); for (int i = 0; i < 10 && i < actual_count; i++) { printf("%d ", numbers[i]); } printf("\n"); // 测量选择排序执行时间 printf("\n4. 开始选择排序...\n"); // 记录开始时间 start = clock(); SelectSort(numbers, actual_count); // 记录结束时间 end = clock(); // 计算并显示执行时间 time_used = ((double)(end - start)) / CLOCKS_PER_SEC; printf("选择排序完成!\n"); printf("执行时间: %.6f 秒\n", time_used); // 显示部分已排序数据 printf("\n6. 已排序数据(前10个): "); for (int i = 0; i < 10 && i < actual_count; i++) { printf("%d ", numbers[i]); } printf("\n"); // 将排序后的数据写入新文件 printf("\n7. 写入排序结果...\n"); writeNumbersToFile(OUTPUT_FILE, numbers, actual_count); printf("\n=== 程序执行完成 ===\n"); return 0; }