求数组中最大的K个数

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

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




代码如下测试的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;  
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值