C语言实现程序从一文件中读取数字,利用快速排序把大于某值的元素排出,并输出排序结果和比较次数
时间: 2024-05-01 14:19:38 浏览: 8
好的,让我来回答你的问题。以下是 C 语言实现程序从一文件中读取数字,利用快速排序把大于某值的元素排出,并输出排序结果和比较次数的代码:
```
#include <stdio.h>
#include <stdlib.h>
void quicksort(int arr[], int left, int right, int* cmpCount);
void swap(int* a, int* b);
int main() {
FILE* fp;
char filename[100];
int num, pivot, count = 0;
int* arr;
int i = 0, j = 0;
printf("请输入文件名: ");
scanf("%s", filename);
fp = fopen(filename, "r");
if (fp == NULL) {
printf("文件打开失败.");
return 1;
}
printf("请输入 pivot 值: ");
scanf("%d", &pivot);
while (fscanf(fp, "%d", &num) == 1) {
if (num > pivot) {
count++;
}
}
arr = (int*)malloc(count * sizeof(int));
fseek(fp, 0, SEEK_SET);
while (fscanf(fp, "%d", &num) == 1) {
if (num > pivot) {
arr[i++] = num;
}
}
printf("排序前数组: ");
for (j = 0; j < i; j++) {
printf("%d ", arr[j]);
}
printf("\n");
quicksort(arr, 0, i - 1, &count);
printf("排序后数组: ");
for (j = 0; j < i; j++) {
printf("%d ", arr[j]);
}
printf("\n");
printf("比较次数: %d\n", count);
fclose(fp);
free(arr);
return 0;
}
void quicksort(int arr[], int left, int right, int* cmpCount) {
int i = left, j = right;
int pivot = arr[(left + right) / 2];
while (i <= j) {
while (arr[i] < pivot) {
i++;
(*cmpCount)++;
}
while (arr[j] > pivot) {
j--;
(*cmpCount)++;
}
if (i <= j) {
swap(&arr[i], &arr[j]);
i++;
j--;
}
}
if (left < j) {
quicksort(arr, left, j, cmpCount);
}
if (i < right) {
quicksort(arr, i, right, cmpCount);
}
}
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
```
希望这可以解决你的问题。如果你有其他问题,欢迎随时问我。