这里我用了编程之美里面的思路,把书中的第二和第四第五三种方法的代码写了一遍。
下面分别是三种方法的代码和书中的思路对照。
代码如下测试的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;
}