top-500

来源:互联网 发布:为什么淘宝销量不增加 编辑:程序博客网 时间:2024/04/28 21:38
/*  Find top-500 min integers among 1000000 random numbers    by using quickselect algorithm, return running time */#include <stdio.h>#include <time.h>void GetNumFile (FILE* sp, long long int num){    int   i;    int   randNum;        // Open file     if ( !(sp = fopen ("topK.txt", "w")) )    {        printf("\aCould not open input file.\n");        exit (100);    }        // Generate random num and write to file    srand ( (unsigned)time(NULL) );    for (i = 0; i < num; ++i)    {        randNum = rand() % 10000 + 1;        fprintf(sp, "%d ", randNum);    }    fclose (sp);}     void swap (int* a, int* b){    int t;    t = *a; *a = *b; *b = t;}void maxHeapify (int A[], int i, int k){    int largest;    int l = 2 * i + 1;    int r = 2 * i + 2;        if ( (l < k) && (A[l] > A[i]) )        largest = l;    else        largest = i;            if ( (r < k) && (A[r] > A[largest]) )        largest = r;            if (largest != i)    {        swap(&A[i], &A[largest]);        maxHeapify(A, largest, k);    }}void Print_topK (int heap[], int k){    int i;        for (i = 0; i < k; ++i)    {        if (i % 20 == 0)            putchar('\n');        printf("%2d ", heap[i]);    }        putchar('\n');}void Read_K_num (FILE* sp, int heap[], int k){    int i;        // Open file    if ( !(sp = fopen ("topK.txt", "r")) )    {        printf("\aCould not open input file.\n");        exit (100);    }        // Read k number to array heap[]    for (i = 0; i < k; ++i)        fscanf(sp, "%d", &heap[i]);        // Heapify the first k number in heap[]    for (i = 0; i <= (int)(k / 2) - 1; ++i)        maxHeapify(heap, i, k);        fclose (sp);}void Heapify_topK (FILE* sp, int heap[], int k, int num){    int i;    int next;        // Open file     if ( !(sp = fopen ("topK.txt", "r")) )    {        printf("\aCould not open input file.\n");        exit (100);    }    for (i = 0; i < num; ++i)    {        if (i < k)            fscanf(sp, "%d", &next);        else        {                fscanf(sp, "%d", &next);            if (next < heap[0])            {                heap[0] = next;                maxHeapify(heap, 0, k);            }        }    }    fclose (sp);}int main(){    long long int num = 1000000;    int k = 300;    int heap[k];    int i;        FILE* sp;    clock_t beg, end;        beg = clock();    GetNumFile(sp, num);    Read_K_num(sp, heap, k);    Heapify_topK(sp, heap, k, num);    end = clock();        printf("Running Time: %.2f\n",  (double)(end - beg));    Print_topK(heap, k);        return 0;}    


0 0
原创粉丝点击