刚完成了一篇博客,讲述的是快速排序,哈哈,研究明白了用起来还是挺爽的
- 题目描述:
-
浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.
- 输入:
-
输入包含多组测试用例.
每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.
n和m同时为0时表示输入结束.
- 输出:
-
请输出乌镇前m个大富翁的财产数,财产多的排前面,如果大富翁不足m个,则全部输出,每组输出占一行.
- 样例输入:
-
3 1
2 5 -1
5 3
1 2 3 4 5
0 0
- 样例输出:
-
5
5 4 3
直接给出用快速排序AC的代码好了
-
#include <stdio.h>
-
#include <stdlib.h>
-
-
-
void quicksort(int *A, int p, int r);
-
int partition(int *A, int p, int r);
-
-
int main()
-
{
-
int n, m, i, j, temp;
-
int rich[100001] = {0};
-
-
while(scanf("%d%d",&n,&m))
-
{
-
-
if(m == 0 && n == 0)
-
{
-
break;
-
}
-
-
-
for(i = 0; i < n; i++)
-
{
-
scanf("%d",&rich[i]);
-
}
-
-
-
quicksort(rich,0,n-1);
-
-
-
if(m <= n)
-
{
-
for(i = 0; i < m; i++)
-
{
-
if(i != m -1)
-
printf("%d ",rich[i]);
-
else
-
printf("%d\n",rich[i]);
-
}
-
}else
-
{
-
for(i = 0; i < n; i++)
-
{
-
if(i != n -1)
-
printf("%d ",rich[i]);
-
else
-
printf("%d\n",rich[i]);
-
}
-
}
-
}
-
return 0;
-
}
-
-
-
-
-
void quicksort(int *A, int p, int r)
-
{
-
int pivot;
-
-
if( p < r)
-
{
-
pivot = partition(A, p, r);
-
quicksort(A, p, pivot - 1);
-
quicksort(A, pivot+1, r);
-
}
-
}
-
-
-
-
-
int partition(int *A, int p, int r)
-
{
-
int left = p;
-
int right = r;
-
int stand = A[p];
-
-
-
while(left < right)
-
{
-
while(left < right && A[right] <= stand)
-
{
-
right --;
-
}
-
if(left < right)
-
A[left ++] = A[right];
-
while(left < right && A[left] >= stand)
-
{
-
left ++;
-
}
-
if(left <right)
-
A[right --] = A[left];
-
}
-
-
A[left] = stand;
-
return left;
-
}