微软等数据结构+算法面试100题005

原创 2011年01月20日 19:44:00

 

#include <iostream>

 

void downHeap(int heapArray[], int lengtArray, int key)

{

int temp = key;

int flag = 0;

int maxkey ;

while ( temp <= (lengtArray-2) / 2 ) { 

if ( temp*2 + 2 <= lengtArray -1 ) {//最后一个节点有右儿子

maxkey = ( heapArray[temp*2+1] < heapArray[temp*2+2] ) ? (temp*2+2) : (temp*2+1) ;

}

else {

maxkey = temp*2 + 1;

}

if ( heapArray[temp] < heapArray[maxkey]) {

flag = heapArray[temp];

heapArray[temp] = heapArray[maxkey];

heapArray[maxkey] = flag ;

 

temp = maxkey ;  //继续向下搜索

}

else 

return ;

 

 

}

}

 

 

void buildMaxHeap(int heapArray[], int lengthArray)

{

for (int i = (lengthArray - 2) / 2 ; i >= 0;  i --) {

downHeap(heapArray, lengthArray, i);

}

}

 

int mindata(int heapArray[])

{

return heapArray[0];

}

 

void Printheap(int heapArray[], int length)

{

int i = length - 1;

int temp;

while( i > 1 ) {

temp = heapArray[i];

heapArray[i] = heapArray[0];

heapArray[0] = temp;

if ( i > 2) {  // 因为是downHeap是为了建最大堆,当只有两个数时,则经过一次转换已经是排好序了,不需要了。

downHeap(heapArray, i, 0);

}

i--;

}

i = 0;

while(i < length ){

std::cout<<heapArray[i]<<" ";

i++;

}

std::cout<<std::endl;

}

 

void findtheleast(int number, int data[], int length, int heapArray[])

{

for(int i = 0; i < number; i++ ) {

heapArray[i] = data[i];

  }

 

 

buildMaxHeap(heapArray, number);

 

for(int i = number; i < length; i++) {

if ( data[i] < mindata(heapArray) ) {

heapArray[0] = data[i];

downHeap(heapArray, number, 0);

 

/* for (int i = 0; i< 4; i++){

std::cout<<heapArray[i]<<" ";

}

std::cout<<std::endl;*/

}

}

Printheap(heapArray, number);

}

 

 

int main()

{

int data[] ={8,7,6,5,4,3,2,1};

int heapArray[4] ={0};

findtheleast(4, data, sizeof(data)/sizeof(int), heapArray);

return 0;

}

 

 

 #include <iostream>

 

void downHeap(int heapArray[], int lengtArray, int key)

{

int temp = key;

int flag = 0;

int maxkey ;

while ( temp <= (lengtArray-2) / 2 ) { 

if ( temp*2 + 2 <= lengtArray -1 ) {//最后一个节点有右儿子

maxkey = ( heapArray[temp*2+1] < heapArray[temp*2+2] ) ? (temp*2+2) : (temp*2+1) ;

}

else {

maxkey = temp*2 + 1;

}

if ( heapArray[temp] < heapArray[maxkey]) {

flag = heapArray[temp];

heapArray[temp] = heapArray[maxkey];

heapArray[maxkey] = flag ;

 

temp = maxkey ;  //继续向下搜索

}

else 

return ;

 

 

}

}

 

 

void buildMaxHeap(int heapArray[], int lengthArray)

{

for (int i = (lengthArray - 2) / 2 ; i >= 0;  i --) {

downHeap(heapArray, lengthArray, i);

}

}

 

int mindata(int heapArray[])

{

return heapArray[0];

}

 

void Printheap(int heapArray[], int length)

{

int i = length - 1;

int temp;

while( i > 1 ) {

temp = heapArray[i];

heapArray[i] = heapArray[0];

heapArray[0] = temp;

if ( i > 2) {  // 因为是downHeap是为了建最大堆,当只有两个数时,则经过一次转换已经是排好序了,不需要了。

downHeap(heapArray, i, 0);

}

i--;

}

i = 0;

while(i < length ){

std::cout<<heapArray[i]<<" ";

i++;

}

std::cout<<std::endl;

}

 

void findtheleast(int number, int data[], int length, int heapArray[])

{

for(int i = 0; i < number; i++ ) {

heapArray[i] = data[i];

  }

 

 

buildMaxHeap(heapArray, number);

 

for(int i = number; i < length; i++) {

if ( data[i] < mindata(heapArray) ) {

heapArray[0] = data[i];

downHeap(heapArray, number, 0);

 

/* for (int i = 0; i< 4; i++){

std::cout<<heapArray[i]<<" ";

}

std::cout<<std::endl;*/

}

}

Printheap(heapArray, number);

}

 

 

int main()

{

int data[] ={8,7,6,5,4,3,2,1};

int heapArray[4] ={0};

findtheleast(4, data, sizeof(data)/sizeof(int), heapArray);

return 0;

}#include <iostream>

 

void downHeap(int heapArray[], int lengtArray, int key)

{

int temp = key;

int flag = 0;

int maxkey ;

while ( temp <= (lengtArray-2) / 2 ) { 

if ( temp*2 + 2 <= lengtArray -1 ) {//最后一个节点有右儿子

maxkey = ( heapArray[temp*2+1] < heapArray[temp*2+2] ) ? (temp*2+2) : (temp*2+1) ;

}

else {

maxkey = temp*2 + 1;

}

if ( heapArray[temp] < heapArray[maxkey]) {

flag = heapArray[temp];

heapArray[temp] = heapArray[maxkey];

heapArray[maxkey] = flag ;

 

temp = maxkey ;  //继续向下搜索

}

else 

return ;

 

 

}

}

 

 

void buildMaxHeap(int heapArray[], int lengthArray)

{

for (int i = (lengthArray - 2) / 2 ; i >= 0;  i --) {

downHeap(heapArray, lengthArray, i);

}

}

 

int mindata(int heapArray[])

{

return heapArray[0];

}

 

void Printheap(int heapArray[], int length)

{

int i = length - 1;

int temp;

while( i > 1 ) {

temp = heapArray[i];

heapArray[i] = heapArray[0];

heapArray[0] = temp;

if ( i > 2) {  // 因为是downHeap是为了建最大堆,当只有两个数时,则经过一次转换已经是排好序了,不需要了。

downHeap(heapArray, i, 0);

}

i--;

}

i = 0;

while(i < length ){

std::cout<<heapArray[i]<<" ";

i++;

}

std::cout<<std::endl;

}

 

void findtheleast(int number, int data[], int length, int heapArray[])

{

for(int i = 0; i < number; i++ ) {

heapArray[i] = data[i];

  }

 

 

buildMaxHeap(heapArray, number);

 

for(int i = number; i < length; i++) {

if ( data[i] < mindata(heapArray) ) {

heapArray[0] = data[i];

downHeap(heapArray, number, 0);

 

/* for (int i = 0; i< 4; i++){

std::cout<<heapArray[i]<<" ";

}

std::cout<<std::endl;*/

}

}

Printheap(heapArray, number);

}

 

 

int main()

{

int data[] ={8,7,6,5,4,3,2,1};

int heapArray[4] ={0};

findtheleast(4, data, sizeof(data)/sizeof(int), heapArray);

return 0;

}

 

基本的思路是:通过一个4个单元的数组,记录当前的最小的4个数 通过堆排序。  最后将这四个数输出。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【证明】关于项链问题中旋转操作的置换群的循环节个数、长度的证明【Pólya】【同余】

做POJ2154时,对于”置换的循环节的个数为gcd(i, n)"表示疑惑,但是看了很多blog,发现都没有证明这个结论,于是这里做个简单的证明。 设一开始珠子的位置在p点,每次旋转x格。 先证明...

【BZOJ1055】[HAOI2008]玩具取名【区间DP】【状压】

【题目链接】 一开始WA,以为DP写跪了,最后发现是hash数组开小了... 设dp[x][y]表示[x, y]这个区间可以化简成的最简状态,其中状态用0到15的二进制表示。 转移时候分...

Java操作XML文件 dom 篇

我们需要引入的包:import java.io.*; import javax.xml.transform.*;    import javax.xml.transform.dom.DOMSource...

【总结】CDQ分治

总的来说,CDQ分治与普通分治不一样的地方在于,CDQ分治的对象是时间。即对于一个时间段[L, R],我们取mid = (L + R) / 2,(用数据结构题举例)分治的每层只考虑mid之前的修改对m...

【BZOJ3390】[Usaco2004 Dec]Bad Cowtractors牛的报复【最大生成树】

【题目链接】 /* Pigonometry */ #include #include using namespace std; typedef long long LL; const ...

【BZOJ1083】[SCOI2005]繁忙的都市【最小瓶颈生成树】

【题目链接】 最小瓶颈生成树 = 最小生成树 水过。 /* Footprints In The Blood Soaked Snow */ #include #include using...

pkusc2016滚粗记

第一次写游记。 Day0 和yzx,hjs一块,早上7点飞机,上了飞机一直睡...醒来后差不多已经降落了。 从机场坐地铁,到北大站。(原来圆明园和中关村都在北大旁边呀) 先去了宾馆,结...

webBrowser控制新窗口

当页面为新窗口弹出时,下面代码分别演示如何在新建form中加载页面以及当前form的web控件加载form1、新建form,这个大多数人都应该知道 。用newwindow2就可以了,不过vs2005...

【BZOJ3450】Tyvj1952 Easy【期望DP】

【题目链接】 这题是【BZOJ4318】的减弱版。 拿过来改改就行了。 /* Footprints In The Blood Soaked Snow */ #include const ...

【BZOJ4318】OSU!【期望DP】

【题目链接】 考虑递推,用立方差公式转移,同时要维护E(x^3),E(x^2),E(x),E(1)。 考虑第i次操作,设操作前末尾最长的1长度为x。 (1)如果操作失败,贡献为0; (2)如果操...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)