求数组中最大的K个数

来源:互联网 发布:php自定义config 编辑:程序博客网 时间:2024/06/04 18:14

这里我用了编程之美里面的思路,把书中的第二和第四第五三种方法的代码写了一遍。

下面分别是三种方法的代码和书中的思路对照。




代码如下测试的main函数代码放到最后面来写。

/************************************************************************//* 编程之美的题目:2.5寻找最大的K个数解法二:*//************************************************************************/template<class Item>void swap1(Item &rhs, Item &lhs){Item tmp = rhs;rhs = lhs;lhs = tmp;}/**快速排序的分割算法*/template<class Item>int partition(Item a[], int l, int r){int compare = a[l];int left = l, right = r;while(left < right){while(left < right && a[right] >= compare) right--;swap1(a[right], a[left]);while(left < right && a[left] <= compare) left++;swap1(a[right], a[left]);}return left;}*找出最大的K个数*/template<class Item>int KBig(Item a[], int l, int r, const int k){if((r - l) < k || k <= 0) return -1;int p = partition(a, l, r);if((p - l) > k) return KBig(a, l, p, k);else if((p - l) <= k) return KBig(a, p + 1, r, k - (p - l));}

第四种解法:





/* 编程之美的题目:2.5寻找最大的K个数 解法四:先用堆排序把K个数排序,然后依次取数据查到堆中。 */  /************************************************************************/  template<class Item>  void HeapAjust(Item *pNumber, int i, int length)  {      if(pNumber == NULL || length <= 0) return;        int k = i;      while((2 * k + 1 < length))      {          int child = 2 * k + 1;          if((child +1) < length && (pNumber[child] < pNumber[child + 1])) child++;                    if(pNumber[k] < pNumber[child]) swap1(pNumber[k], pNumber[child]);            k = child;      }  }    /*上面一个函数式创建大顶堆,这个是相反的创建小顶堆,当然两个函数也可以写成一个函数*/  template<class Item>  void HeapAjustSmall(Item *pNumber, int i, int length)  {      if(pNumber == NULL || length <= 0) return;            int k = i;      while((2 * k + 1 < length))      {          int child = 2 * k + 1;          if((child +1) < length && (pNumber[child] > pNumber[child + 1])) child++;                    if(pNumber[k] > pNumber[child]) swap1(pNumber[k], pNumber[child]);                    k = child;      }  }    template<typename Item>  void KBig(Item *pNumber, int k, int length)  {      if(pNumber == NULL || k >= length || length < 2) return;        Item *pK = new Item[k];        int i =0;      while(i < k)      {          pK[i++] = pNumber[i];      //  i++;      }        for(i = k / 2 - 1; i >= 0; --i)      {          HeapAjustSmall(pK, i, k);      }        for(i = k; i < length; ++i)      {          if(pNumber[i] > pK[0]) swap1(pNumber[i], pK[0]);            HeapAjustSmall(pK, 0, k);      }        for(i = 0; i < k; ++i) cout<<pK[i]<<endl;  }