#include <stdio.h>
#include <string.h>
#define N 2578
void swap(int *p, int *q)
{
int tmp;
tmp = *p;
*p = *q;
*q = tmp;
}
/* 把a[t]作为参考,将数组分成三部分: 小于等于a[t],
* a[t]以及大于a[t],分割完毕后,a[t]所在的下标即是a[t]的顺序
*/
int partition(int *a, int s, int t)
{
int i, j; /* i用来遍历a[s]...a[t-1], j指向大于x部分的第一个元素 */
for (i = j = s; i < t; i++) {
if (a[i] < a[t]) {
swap(a+i, a+j);
j++;
}
}
swap(a+j, a+t);
return j;
}
/* 选择数组中第i大的元素并返回 */
int quick_select(int *a, int s, int t, int i)
{
int p, m;
if (s == t) return a[t];
p = partition(a, s, t); /* 用a[t]分割数组 */
m = p - s + 1; /* m是a[t]在小组内的排名 */
if (m == i) return a[p];
if (m > i) {
return quick_select(a, s, p-1, i);
}
return quick_select(a, p+1, t, i-m);
}
void quick_sort(int *a, int s, int t)
{
int p;
if (s < t) {
p = partition(a, s, t);
quick_sort(a, s, p-1);
quick_sort(a, p+1, t);
}
}
int main()
{
int i;
int a[N+1];
for (i = 0; i <= N; i++) {
a[i] = N-i;
}
quick_sort(a, 0, N);
printf("第%d大的数为%d\n", 2, quick_select(a, 0, N, 2));
return 0;
}
快速排序 顺序统计量 数组分割
最新推荐文章于 2025-05-13 21:37:25 发布
本文介绍了一种基于快速排序的快速选择算法实现,该算法能够高效地找出未完全排序数组中的第k大元素。通过递归分区的方式,文章详细解释了如何对数组进行划分,并在划分过程中找到指定位置的元素。
2338

被折叠的 条评论
为什么被折叠?



