查找最小的K个元素,使用最大堆。

来源:互联网 发布:color finale mac 编辑:程序博客网 时间:2024/06/06 09:39

查找最小的K个元素,使用最大堆,具体代码如下:

[cpp] view plaincopy
  1. #define _CRT_SECURE_NO_WARNINGS  
  2. #include <iostream>  
  3. using namespace std;  
  4. void swap(int *a, int *b)  
  5. {  
  6.   
  7.     int temp;  
  8.     temp = *a;  
  9.     *a = *b;  
  10.     *b = temp;  
  11. }  
  12. void heap_adjust(int *a, int i, int size)  
  13. {  
  14.     int lchild = 2 * i;  
  15.     int rchild = 2 * i + 1;  
  16.     int max = i;  
  17.     if (i <= size / 2) //大于size/2的为叶子节点,不需要调整  
  18.     {  
  19.   
  20.         if (lchild <= size && a[lchild]>a[max])  
  21.             max = lchild;  
  22.         if (rchild <= size && a[rchild]>a[max])  
  23.   
  24.             max = rchild;  
  25.         if (max != i)  
  26.         {  
  27.             swap(&a[i], &a[max]);  
  28.             heap_adjust(a, max, size); //依此调整下面的子树,为了防止交换之后不满足堆的性质  
  29.         }  
  30.     }  
  31. }  
  32.   
  33.   
  34. void create_heap(int *a, int size)  
  35. {  
  36.     int i = 0;  
  37.     for (i = size / 2; i >= 1; i--)  
  38.         heap_adjust(a, i, size);  
  39. }  
  40.   
  41. void heap_sort(int *a, int size)  
  42. {  
  43.     int i = 0;  
  44.     int temp = 0;  
  45.     create_heap(a, size);  
  46.     for (i = size; i >= 1; i--)  
  47.     {  
  48.   
  49.         swap(&a[i], &a[1]);  
  50.         heap_adjust(a, 1, i - 1);  
  51.     }  
  52. }  
  53.   
  54.   
  55. int main(int argc, char **argv)  
  56. {  
  57.     int a[100];  
  58.     int size = 0;  
  59.     int nTemp = 0;  
  60.     cout << "堆个数:";  
  61.     while (scanf("%d", &size) == 1 && size >0)  
  62.     {  
  63.         int i = 0;  
  64.         for (i = 1; i <= size; i++)  
  65.             scanf("%d", &a[i]);  
  66.         heap_sort(a, size);  
  67.         printf("请输入要显示的K\n");  
  68.         scanf("%d", &nTemp);  
  69.         for (i = 1; i <= nTemp; i++)  
  70.             printf("%d ", a[i]);  
  71.     }  
  72.     return 0;  
  73. }  
运行效果如图1所示:

图1 运行效果

0 0