/* 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;
}
top-500
最新推荐文章于 2022-10-20 20:53:13 发布