寻找大富翁
刚完成了一篇博客,讲述的是快速排序,哈哈,研究明白了用起来还是挺爽的
- 题目描述:
- #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]);elseprintf("%d\n",rich[i]);}}else{for(i = 0; i < n; i++){if(i != n -1)printf("%d ",rich[i]);elseprintf("%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;}