找寻大富翁

寻找大富翁

刚完成了一篇博客,讲述的是快速排序,哈哈,研究明白了用起来还是挺爽的

题目描述:
    浙江桐乡乌镇共有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);

		//判断m和n的大小,进行输入
		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;
}

/**
 * Description:快速排序主流程
 */
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);
	}
}

/**
 * Description:快速排序寻找基准点
 */
int partition(int *A, int p, int r)
{
	int left = p;	//从左往右扫描
	int right = r; 	//从右往左扫描
	int stand = A[p];	//基准

	//从区间两端向中间扫描,直到left==right为止
	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;
}