数组中最大的几个数
使用了堆排序,因为没有必要将全部排好序,堆排序恰好符合要求。
#include <stdio.h> init(int num[], int n){ int h, i; if(n <= 1) return 0; i = n - 1; h = (i - 1) / 2; while(i > 0){ creatHeap(num, n, h); i--; if((i - 1) / 2 == h) i--; h = (i - 1) / 2;//下一个非叶结点 } } //整理非叶结点的堆 creatHeap(int num[], int n, int h){ int temp = num[h];//临时存放数据 int i;//指示叶结点 int flag = 0;//是否找到适合位置的标志 i = 2 * h + 1; while(flag == 0 && i < n){ if(i + 1 < n){//求子节点较大的那个。 if(num[i] < num[i + 1]) i++; } if(temp < num[i]){//比较最开始的父节点 num[h] = num[i]; h = i; i = 2 * h + 1; } else{ flag = 1; } } num[h] = temp; } main(){ int i, j, temp; int num[] = {10, 50, 32, 5, 76, 9, 40, 88};//数组 int n = 8;//数组个数 int m = 3;//要找几个最大数 init(num, n); for(j = 1; j < m; j++){ temp = num[0]; num[0] = num[n - j]; num[n - j] = temp; creatHeap(num, n - j, 0); } temp = num[0]; num[0] = num[n - j]; num[n - j] = temp; for(i = 0; i < n; i++) printf("%d \n", num[i]); }