数组中最大的几个数

使用了堆排序,因为没有必要将全部排好序,堆排序恰好符合要求。

 

#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]);
}

 

posted @ 2014-02-25 11:41  yutoulck  阅读(621)  评论(0编辑  收藏  举报