Guest User

Untitled

a guest
Dec 18th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.16 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class Answer {
  4.  
  5. public static final int MAX = 4000;
  6.  
  7. /** Main method. */
  8. static public void main (String[] args) {
  9. List<Integer> randlist = new ArrayList<Integer> (MAX); // original
  10. Random generaator = new Random();
  11. int maxKey = Math.min (1000, (MAX+32)/16);
  12. for (int i = 0; i < MAX; i++) {
  13. randlist.add (new Integer (generaator.nextInt (maxKey)));
  14. }
  15.  
  16. int rightLimit = randlist.size()/16;
  17.  
  18. // Start a competition
  19. for (int round=0; round<4; round++) {
  20. rightLimit = 2*rightLimit;
  21. System.out.println ("\nLength: "+String.valueOf (rightLimit));
  22.  
  23. List<Integer> copy1 = new ArrayList<Integer> (randlist);
  24. long stime = new Date().getTime();
  25. insertionSort (copy1, 0, rightLimit);
  26. long ftime = new Date().getTime();
  27. int diff = new Long (ftime-stime).intValue();
  28. System.out.println ("\nInsertion sort");
  29. System.out.println ("Time (ms): " + String.valueOf (diff));
  30. if (!checkOrder (copy1, 0, rightLimit))
  31. throw new RuntimeException ("Wrong order!!!");
  32. List<Integer> copy2 = new ArrayList<Integer> (randlist);
  33. stime = new Date().getTime();
  34. bisort (copy2, 0, rightLimit);
  35. ftime = new Date().getTime();
  36. diff = new Long (ftime-stime).intValue();
  37. System.out.println ("\nBinary insertion sort");
  38. System.out.println ("Time (ms): " + String.valueOf (diff));
  39. if (!checkOrder (copy2, 0, rightLimit))
  40. throw new RuntimeException ("Wrong order!!!");
  41. List<Pair> opairs = new ArrayList<Pair> (MAX);
  42. for (int i=0; i < randlist.size(); i++) {
  43. opairs.add (new Pair (randlist.get(i), i));
  44. }
  45. bisort (opairs, 0, rightLimit);
  46. if (!checkStability (opairs, 0, rightLimit))
  47. throw new RuntimeException ("Method not stable!");
  48. List<Integer> copy3 = new ArrayList<Integer> (randlist);
  49. stime = new Date().getTime();
  50. qsort (copy3, 0, rightLimit);
  51. ftime = new Date().getTime();
  52. diff = new Long (ftime-stime).intValue();
  53. System.out.println ("\nQuicksort");
  54. System.out.println ("Time (ms): " + String.valueOf (diff));
  55. if (!checkOrder (copy3, 0, rightLimit))
  56. throw new RuntimeException ("Wrong order!!!");
  57. List<Integer> copy4 = new ArrayList<Integer> (randlist);
  58. Integer[] sarray = new Integer[rightLimit];
  59. sarray = (Integer[])copy4.toArray (sarray);
  60. stime = new Date().getTime();
  61. Arrays.sort (sarray, 0, rightLimit);
  62. ftime = new Date().getTime();
  63. copy4 = Arrays.asList (sarray);
  64. diff = new Long (ftime-stime).intValue();
  65. System.out.println ("\njava.util.Arrays");
  66. System.out.println ("Time (ms): " + String.valueOf (diff));
  67. if (!checkOrder (copy4, 0, rightLimit))
  68. throw new RuntimeException ("Wrong order!!!");
  69. List<Integer> copy5 = new ArrayList<Integer> (randlist);
  70. copy5 = copy5.subList (0, rightLimit);
  71. stime = new Date().getTime();
  72. Collections.sort (copy5);
  73. ftime = new Date().getTime();
  74. diff = new Long (ftime-stime).intValue();
  75. System.out.println ("\njava.util.Collections");
  76. System.out.println ("Time (ms): " + String.valueOf (diff));
  77. if (!checkOrder (copy5, 0, rightLimit))
  78. throw new RuntimeException ("Wrong order!!!");
  79. }
  80. } // main()
  81.  
  82. /**
  83. * Sort a part of the list using quicksort method.
  84. * @param array list
  85. * @param l starting index (included)
  86. * @param r ending index (excluded)
  87. */
  88. static public <T extends Object & Comparable<? super T>>
  89. void qsort (List<T> array, int l, int r) {
  90. if (array.size() < 2) return;
  91. if ((r-l)<2) return;
  92. int i = l; int j = r-1;
  93. T x = array.get ((i+j) / 2);
  94. do {
  95. while (array.get (i).compareTo (x) < 0) i++;
  96. while (x.compareTo (array.get (j)) < 0) j--;
  97. if (i <= j) {
  98. T tmp = array.get (i);
  99. array.set (i, array.get (j));
  100. array.set (j, tmp);
  101. i++; j--;
  102. }
  103. } while (i < j);
  104. if (l < j) qsort (array, l, j+1); // recursion for left part
  105. if (i < r-1) qsort (array, i, r); // recursion for right part
  106. } // qsort()
  107.  
  108. /**
  109. * Sort a part of the list using binary insertion sort method
  110. * in a stable manner.
  111. * @param a list
  112. * @param left starting position (included)
  113. * @param right ending position (excluded)
  114. */
  115. static public <T extends Object & Comparable<? super T>>
  116. void bisort (List<T> a, int left, int right) {
  117. if (a.size() < 2) return;
  118. for (int i=1; i<a.size(); i++) {
  119. Comparable b = (Comparable) a.remove (i);
  120. int j;
  121. for (j=0; j<i; j++) {
  122. // TODO!!! Your code here!
  123. }
  124. a.add (j, b); // pistame b kohale j
  125. }
  126. }
  127.  
  128.  
  129. // bisort()
  130.  
  131. /**
  132. * Sort a part of the list of comparable elements using insertion sort.
  133. * @param a list
  134. * @param l starting position (included)
  135. * @param r ending position (excluded)
  136. */
  137. static public <T extends Object & Comparable<? super T>>
  138. void insertionSort (List<T> a, int l, int r) {
  139. if (a.size() < 2) return;
  140. if ((r-l)<2) return;
  141. for (int i = l+1; i < r; i++) {
  142. T b = a.remove (i);
  143. int j;
  144. for (j=l; j < i; j++) {
  145. if (b.compareTo (a.get (j)) < 0) break;
  146. }
  147. a.add (j, b); // insert b to position j
  148. }
  149. } // insertionSort()
  150.  
  151. /**
  152. * Check whether a given interval in the list is ordered.
  153. * @param a sorted (?) list.
  154. * @param l left index (included)
  155. * @param r right index (excluded)
  156. * @return interval is ordered?
  157. */
  158. static <T extends Object & Comparable<? super T>>
  159. boolean checkOrder (List<T> a, int l, int r) {
  160. if (a==null)
  161. throw new IllegalArgumentException();
  162. if (a.size() < 2)
  163. return true;
  164. if (l<0 || r>a.size() || l>=r)
  165. throw new IllegalArgumentException();
  166. if (r-l < 2)
  167. return true;
  168. for (int i=l; i<r-1; i++) {
  169. if (a.get (i).compareTo (a.get (i+1)) > 0)
  170. return false;
  171. } // for
  172. return true;
  173. } // checkOrder()
  174.  
  175. /** Is the list sorted in a stable manner. */
  176. static boolean checkStability (List<Pair> a, int l, int r) {
  177. if (a==null)
  178. throw new IllegalArgumentException();
  179. if (a.size() < 2)
  180. return true;
  181. if (l<0 || r>a.size() || l>=r)
  182. throw new IllegalArgumentException();
  183. if (r-l < 2)
  184. return true;
  185. for (int i=l; i<r-1; i++) {
  186. if (a.get (i).compareTo (a.get (i+1)) > 0)
  187. return false;
  188. else if (a.get(i).compareTo (a.get(i+1)) == 0) {
  189. // System.out.print("=");
  190. if (((Pair)a.get(i)).getSecundo()
  191. > ((Pair)a.get(i+1)).getSecundo()) {
  192. System.out.println ("Method is not stable. First error: " +
  193. i + ". " + a.get(i) + " <--> " + (i+1) +
  194. ". " + a.get(i+1));
  195. return false;
  196. }
  197. }
  198. } // for
  199. return true;
  200. }
  201. }
  202.  
  203. /** Local class to test stability. */
  204. class Pair implements Comparable<Pair> {
  205.  
  206. private int primo;
  207. private int secundo;
  208.  
  209. Pair (int a, int b) {
  210. primo=a;
  211. secundo=b;
  212. }
  213.  
  214. public int getPrimo() {
  215. return primo;
  216. }
  217.  
  218. public int getSecundo() {
  219. return secundo;
  220. }
  221.  
  222. @Override
  223. public String toString() {
  224. return "(" + String.valueOf(primo) + ","
  225. + String.valueOf(secundo) + ")";
  226. }
  227.  
  228. public int compareTo (Pair o) {
  229. int esim = this.primo;
  230. int teine = ((Pair)o).primo;
  231. if (esim > teine)
  232. return 1;
  233. else
  234. if (esim < teine)
  235. return -1;
  236. else return 0;
  237. }
  238. } // Pair
Add Comment
Please, Sign In to add comment