快速排序找出第k小数c语言用while语句实现
时间: 2024-09-30 22:15:44 浏览: 30
51单片机-for语句do...while语句if...else...语句产生随机数rand()C语言常用基本语句例程源码
5星 · 资源好评率100%
快速排序是一种高效的排序算法,它通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录继续进行排序,直到整个序列有序。要在C语言中使用while循环实现快速排序并找出第k小的元素,你可以按照以下步骤:
```c
#include <stdio.h>
// 交换两个元素
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 分割数组并将pivot移动到正确位置(小于等于pivot的元素都在左边)
int partition(int arr[], int low, int high, int k) {
int pivot = arr[high], i = (low - 1);
while (i >= low) {
if (arr[i] <= pivot) {
i--;
swap(&arr[i], &arr[i + 1]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
// 快速排序函数
int quicksort(int arr[], int low, int high, int k) {
if (low < high) {
// 找到第k小的元素的索引
int pi = partition(arr, low, high, k);
// 如果pi是k,直接返回
if (pi == k)
return arr[pi];
else if (pi > k)
return quicksort(arr, low, pi - 1, k);
else
return quicksort(arr, pi + 1, high, k);
}
return arr[low]; // 当只有一个元素或已经有序时,返回该元素
}
// 主函数测试
int main() {
int arr[] = {9, 7, 5, 11, 12, 2, 14, 3, 10};
int n = sizeof(arr) / sizeof(arr[0]), k;
printf("Enter the value of k: ");
scanf("%d", &k);
quicksort(arr, 0, n - 1, k - 1); // 注意:快速排序找的是第k小,所以我们输入k-1
printf("The %dth smallest element is: %d\n", k, arr[k - 1]);
return 0;
}
```
在这个程序中,`quicksort`函数是一个递归过程,而`partition`函数用于每次分割操作。用户需要提供一个整数`k`,程序会找到数组中的第k小元素。
阅读全文