歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 百度面試題 --- 錦標賽排序

百度面試題 --- 錦標賽排序

日期:2017/2/28 15:30:47   编辑:Linux教程

面了一次百度,暫時完成兩輪技術面試,感覺每次都好多題目,並且有一些不知道怎麼回答,看來准備的還是不夠好。

先分享一個題目吧:

給出一個長度是N的數組,現在要找出最大的兩個元素,最少要多少次比較。

分析: 如果找出1個最大的,比較次數無疑是 n - 1,

現在如果已經找出最大的了,那麼再找第二大的,如果用競賽排序的方法,可以再使用 logn就可以找到了。 不過不知道怎麼證明 這是最小次數。

順便實現了一下 競賽排序。

  1. public class TournamentSort {
  2. private class Node//用node來存儲競賽排序過程中的節點,包括裡面的數據和數據在數組中的ID
  3. {
  4. public int data;
  5. public int id;
  6. public Node()
  7. {
  8. }
  9. public Node(int _data, int _id)//
  10. {
  11. data = _data;
  12. id = _id;
  13. }
  14. }
  15. public void Adjust(Node[] data, int idx)//當去除最小元素以後,我們要調整數組
  16. {
  17. while(idx != 0)
  18. {
  19. if(idx % 2 == 1)//當前id是奇數,說明並列的是idx + 1, 父節點是 (idx-1)/2
  20. {
  21. if(data[idx].data < data[idx + 1].data)
  22. {
  23. data[(idx - 1)/2] = data[idx];
  24. }
  25. else
  26. {
  27. data[(idx-1)/2] = data[idx + 1];
  28. }
  29. idx = (idx - 1)/2;
  30. }
  31. else
  32. {
  33. if(data[idx-1].data < data[idx].data)
  34. {
  35. data[idx/2 - 1] = data[idx-1];
  36. }
  37. else
  38. {
  39. data[idx/2 - 1] = data[idx];
  40. }
  41. idx = (idx/2 - 1);
  42. }
  43. }
  44. }
  45. public void Sort(int[] data)
  46. {
  47. int nNodes = 1;
  48. int nTreeSize;
  49. while(nNodes < data.length)
  50. {
  51. nNodes *= 2;
  52. }
  53. nTreeSize = 2 * nNodes - 1;//競賽樹節點的個數, nNode算出來是為了做成滿二叉樹
  54. Node[] nodes = new Node[nTreeSize];//競賽樹用數組存儲
  55. //initialize the data
  56. int i, j;
  57. int idx;
  58. for( i = nNodes - 1; i < nTreeSize; i++) //初始化競賽樹數據
  59. {
  60. idx = i - (nNodes - 1);
  61. if(idx < data.length)
  62. {
  63. nodes[i] = new Node(data[idx], i);
  64. }
  65. else
  66. {
  67. nodes[i] = new Node(Integer.MAX_VALUE, -1);//對於補充的數據,我們初始化成最大。
  68. }
  69. }
  70. for( i = nNodes - 2; i >= 0; i--)//
  71. {
  72. nodes[i] = new Node();
  73. if(nodes[i * 2 + 1].data < nodes[i * 2 + 2].data)
  74. {
  75. nodes[i] = nodes[i*2 + 1];
  76. }
  77. else
  78. {
  79. nodes[i] = nodes[i*2 + 2];
  80. }
  81. }
  82. //the real sorting procedure
  83. for( i = 0; i < data.length; i++)//實際排序的過程
  84. {
  85. data[i] = nodes[0].data;//取出最小的
  86. nodes[nodes[0].id].data = Integer.MAX_VALUE;
  87. Adjust(nodes, nodes[0].id);
  88. }
  89. }
  90. }
Copyright © Linux教程網 All Rights Reserved