当前位置:   article > 正文

树形排序TreeSelection Sort 竞标赛排序 Tournament Sort_amis treeselection

amis treeselection

https://github.com/rugyoga/Tournament-sort/blob/master/java/array/Tournament.java

  1. import java.util.Comparator;
  2. import java.util.Random;
  3. import java.util.Arrays;
  4. import java.util.ArrayList;
  5. import java.util.Stack;
  6. class Tournament<T>
  7. {
  8. Comparator<T> comparator;
  9. T[] array;
  10. int[] matches;
  11. int tourney;
  12. Tournament( Comparator<T> comparator, T[] v )
  13. {
  14. this.array = v;
  15. this.matches = new int[6*v.length];
  16. this.comparator = comparator;
  17. this.tourney = knockout( 0, v.length-1, 3 );
  18. }
  19. public T pop()
  20. {
  21. T result = array[getPlayer( tourney )];
  22. tourney = isPlayer( tourney ) ? 0 : rebuild( tourney );
  23. return result;
  24. }
  25. public static <T> void sort( T[] v, Comparator<T> comparator )
  26. {
  27. Tournament<T> tourney = new Tournament<T>( comparator, v );
  28. ArrayList<T> copy = new ArrayList<T>( v.length );
  29. for (int i = 0; i < v.length; i++)
  30. copy.add( tourney.pop() );
  31. copy.toArray( v );
  32. }
  33. private int getPlayer( int i )
  34. {
  35. return i <= 0 ? Math.abs(i) : getWinner( i );
  36. }
  37. private void setWinner( int root, int winner ) { matches[root] = winner; }
  38. private void setWinners( int root, int winners ) { matches[root+1] = winners; }
  39. private void setLosers( int root, int losers ) { matches[root+2] = losers; }
  40. private int getWinner( int root ) { return matches[root]; }
  41. private int getWinners( int root ) { return matches[root+1]; }
  42. private int getLosers( int root ) { return matches[root+2]; }
  43. private void setMatch( int root, int winner, int winners, int losers )
  44. {
  45. matches[root] = winner;
  46. matches[root+1] = winners;
  47. matches[root+2] = losers;
  48. }
  49. private int mkMatch( int top, int bot, int root )
  50. {
  51. int top_w = getPlayer( top );
  52. int bot_w = getPlayer( bot );
  53. if (comparator.compare( array[top_w], array[bot_w] ) <= 0)
  54. setMatch( root, top_w, top, bot );
  55. else
  56. setMatch( root, bot_w, bot, top );
  57. return root;
  58. }
  59. private int mkPlayer( int i ){ return -i; }
  60. private int knockout( int i, int k, int root )
  61. {
  62. if (i == k) return mkPlayer( i );
  63. int j = (i+k)/2;
  64. return mkMatch( knockout( i, j, 2*root ), knockout( j+1, k, 2*root+3 ), root );
  65. }
  66. private boolean isPlayer( int i ) { return i <= 0; }
  67. public String toString( int root )
  68. {
  69. return isPlayer( root ) ?
  70. "[" + array[-root] + "]" :
  71. "(" + toString( getLosers( root ) ) +
  72. " " + array[getWinner( root )] + " " +
  73. toString( getWinners( root ) ) + ")";
  74. }
  75. public int rebuild( int root )
  76. {
  77. if (isPlayer( getWinners( root ) ))
  78. return getLosers( root );
  79. else
  80. {
  81. setWinners( root, rebuild( getWinners( root ) ) );
  82. if (comparator.compare( array[getPlayer(getLosers( root ))], array[getPlayer(getWinners( root ))] ) < 0)
  83. {
  84. setWinner( root, getPlayer( getLosers( root ) ) );
  85. int temp = getLosers( root );
  86. setLosers( root, getWinners( root ) );
  87. setWinners( root, temp );
  88. }
  89. else
  90. setWinner( root, getPlayer( getWinners( root ) ) );
  91. return root;
  92. }
  93. }
  94. static Integer[] randomInts( int n )
  95. {
  96. Random r = new Random( 12345678 );
  97. Integer[] v = new Integer[n];
  98. for (int i = 0; i < n; i++)
  99. v[i] = r.nextInt( 10*n );
  100. return v;
  101. }
  102. static void time( String description, Runnable action, InstrumentedCompare compare )
  103. {
  104. long start = System.currentTimeMillis();
  105. action.run();
  106. long finish = System.currentTimeMillis();
  107. System.out.println( description + " took " + ((double)(finish-start)/1000.0) +" secs " + compare.count + " comparisons" );
  108. }
  109. static class InstrumentedCompare implements Comparator<Integer>
  110. {
  111. public int count = 0;
  112. public int compare( Integer a, Integer b )
  113. {
  114. count++;
  115. return a.compareTo( b );
  116. }
  117. }
  118. public static void main( String[] args )
  119. {
  120. int n = args.length >= 1 ? Integer.parseInt( args[0] ) : 100000;
  121. final InstrumentedCompare tournamentCompare = new InstrumentedCompare();
  122. final Integer[] nums = randomInts( n );
  123. time( "Tournament.sort", new Runnable(){ public void run(){ Tournament.sort( nums, tournamentCompare ); } }, tournamentCompare );
  124. final Integer[] nums2 = randomInts( n );
  125. final InstrumentedCompare systemCompare = new InstrumentedCompare();
  126. time( "Array.sort", new Runnable(){ public void run(){ Arrays.sort( nums2, systemCompare ); } }, systemCompare );
  127. for (int i = 0; i < n; i++)
  128. if (nums[i].compareTo( nums2[i] ) != 0)
  129. {
  130. System.err.println( "Arrays do not match at index: " + i );
  131. return;
  132. }
  133. }
  134. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/993265
推荐阅读
相关标签
  

闽ICP备14008679号