寻找大富翁

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

题目描述:
    浙江桐乡乌镇共有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的代码好了

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4.   
  5. void quicksort(int *A, int p, int r);  
  6. int partition(int *A, int p, int r);  
  7.   
  8. int main()  
  9. {  
  10.     int n, m, i, j, temp;  
  11.     int rich[100001] = {0};  
  12.   
  13.     while(scanf("%d%d",&n,&m))  
  14.     {  
  15.         //终止条件  
  16.         if(m == 0 && n == 0)  
  17.         {  
  18.             break;  
  19.         }  
  20.   
  21.         //循环接受财富赋值  
  22.         for(i = 0; i < n; i++)  
  23.         {  
  24.             scanf("%d",&rich[i]);  
  25.         }  
  26.   
  27.         //快速排序对财富进行从大到小排序  
  28.         quicksort(rich,0,n-1);  
  29.   
  30.         //判断m和n的大小,进行输入  
  31.         if(m <= n)  
  32.         {  
  33.             for(i = 0; i < m; i++)  
  34.             {  
  35.                 if(i != m -1)  
  36.                     printf("%d ",rich[i]);  
  37.                 else  
  38.                     printf("%d\n",rich[i]);  
  39.             }  
  40.         }else  
  41.         {  
  42.             for(i = 0; i < n; i++)  
  43.             {  
  44.                 if(i != n -1)  
  45.                     printf("%d ",rich[i]);  
  46.                 else  
  47.                     printf("%d\n",rich[i]);  
  48.             }  
  49.         }  
  50.     }  
  51.     return 0;  
  52. }  
  53.   
  54. /** 
  55.  * Description:快速排序主流程 
  56.  */  
  57. void quicksort(int *A, int p, int r)  
  58. {  
  59.     int pivot;  
  60.   
  61.     if( p < r)  
  62.     {  
  63.         pivot = partition(A, p, r);  
  64.         quicksort(A, p, pivot - 1);  
  65.         quicksort(A, pivot+1, r);  
  66.     }  
  67. }  
  68.   
  69. /** 
  70.  * Description:快速排序寻找基准点 
  71.  */  
  72. int partition(int *A, int p, int r)  
  73. {  
  74.     int left = p;   //从左往右扫描  
  75.     int right = r;  //从右往左扫描  
  76.     int stand = A[p];   //基准  
  77.   
  78.     //从区间两端向中间扫描,直到left==right为止  
  79.     while(left < right)  
  80.     {  
  81.         while(left < right && A[right] <= stand)  
  82.         {  
  83.             right --;  
  84.         }  
  85.         if(left < right)  
  86.             A[left ++] = A[right];  
  87.         while(left < right && A[left] >= stand)  
  88.         {  
  89.             left ++;  
  90.         }  
  91.         if(left <right)  
  92.             A[right --] = A[left];  
  93.     }  
  94.     //基准最后的定位位置  
  95.     A[left] = stand;  
  96.     return left;  
  97. }  
posted @ 2012-10-06 14:51  java程序员填空  阅读(296)  评论(0编辑  收藏  举报