Advertisement
Guest User

phoxis

a guest
Nov 15th, 2011
722
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.53 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.Scanner;
  3. import java.lang.Thread;
  4. import java.util.Random;
  5.  
  6. class mergeSort
  7. {
  8. static void merge (int arr[], int low, int mid, int high)
  9. {
  10. int buf1[], buf2[];
  11. int n1 = mid - low + 1, n2 = high - mid;
  12. int j, i1, i2;
  13.  
  14. if (Runtime.getRuntime (). freeMemory () < ((n1 + n2) * 4))
  15. Runtime.getRuntime (). gc ();
  16. buf1 = new int [n1];
  17. buf2 = new int [n2];
  18.  
  19. for (i1=0, j=low; i1<n1; i1++, j++)
  20. buf1[i1] = arr[j];
  21.  
  22. for (i2=0, j=mid+1; i2<n2; i2++, j++)
  23. buf2[i2] = arr[j];
  24.  
  25. for (i1=0, i2=0, j=low; (i1<n1) && (i2<n2); j++)
  26. {
  27. if (buf1[i1] < buf2[i2])
  28. arr[j] = buf1[i1++];
  29. else
  30. arr[j] = buf2[i2++];
  31. }
  32. while (i1 < n1)
  33. arr[j++] = buf1[i1++];
  34. while (i2 < n2)
  35. arr[j++] = buf2[i2++];
  36. }
  37.  
  38. static void sort (int arr[], int low, int high)
  39. {
  40. if (low < high)
  41. {
  42. int mid = (high + low)/2;
  43. sort (arr, low, mid);
  44. sort (arr, mid + 1, high);
  45. merge (arr, low, mid, high);
  46. }
  47. }
  48. }
  49.  
  50. class multiThreadMergeSortThreads extends mergeSort implements Runnable
  51. {
  52. int arr[], init_low, init_high;
  53.  
  54. multiThreadMergeSortThreads (int init_arr[], int low, int high)
  55. {
  56. arr = init_arr;
  57. init_low = low;
  58. init_high = high;
  59. }
  60.  
  61. public void run ()
  62. {
  63. mergeSort.sort (arr, init_low, init_high);
  64. // System.out.print ("[#" + init_low + "," + init_high + "] ");
  65. }
  66. }
  67.  
  68. class multiThreadMergeSort
  69. {
  70. static Thread t[];
  71. static multiThreadMergeSortThreads ob[];
  72. static int threads, i;
  73.  
  74. static void mtSort (int arr[], int low, int high, int tno)
  75. {
  76. int size = (int) Math.ceil ((double)arr.length/(double)tno), low_index = low, high_index, mid_index;
  77. threads = tno;
  78. t = new Thread [threads];
  79. ob = new multiThreadMergeSortThreads [threads];
  80.  
  81. for (i=0; i<threads; i++)
  82. {
  83. high_index = low_index + size - 1;
  84. if (high_index > high)
  85. {
  86. high_index = high;
  87. }
  88. ob[i] = new multiThreadMergeSortThreads (arr, low_index, high_index);
  89. t[i] = new Thread (ob[i]);
  90. low_index = high_index + 1;
  91. }
  92. for (i=0; i<threads; i++)
  93. {
  94. t[i].start ();
  95. }
  96.  
  97. for (i=0; i<threads; i++)
  98. {
  99. try
  100. {
  101. t[i].join ();
  102. }
  103. catch (InterruptedException e)
  104. {
  105. }
  106. }
  107.  
  108. while (size < arr.length)
  109. {
  110. for (low_index = low, i=0; low_index < high;)
  111. {
  112. mid_index = low_index + size - 1;
  113. high_index = mid_index + size;
  114. if (high_index > high)
  115. high_index = high;
  116. mergeSort.merge (arr, low_index, mid_index, high_index);
  117. // System.out.print ("\n(" + low_index + "," + mid_index + "," + high_index + "):(" + size + ")");
  118. low_index = high_index + 1;
  119. }
  120. size = size * 2;
  121. }
  122. }
  123. }
  124.  
  125.  
  126. class mergeSortTest
  127. {
  128. public static void main (String args[])
  129. {
  130. Scanner sc = new Scanner (System.in);
  131. Random rand = new Random ();
  132. System.out.print ("\nEnter n: ");
  133.  
  134. int n = sc.nextInt ();
  135. int arr[] = new int [n];
  136.  
  137. for (int i=0; i<n; i++)
  138. {
  139. arr[i] = rand.nextInt ();
  140. // arr[i] = sc.nextInt ();
  141. }
  142.  
  143. // System.out.print ("\n\n");
  144. // for (int i=0; i<n; i++)
  145. // {
  146. // System.out.print ("[" + arr[i] + "] ");
  147. // }
  148. // System.out.print ("\n\n");
  149. // mergeSort.sort (arr, 0, arr.length - 1);
  150. multiThreadMergeSort.mtSort (arr, 0, arr.length - 1, 4);
  151.  
  152. boolean flag = true;
  153. for (int i=0; i<n-1; i++)
  154. {
  155. if (arr[i] > arr[i+1])
  156. {
  157. flag = false;
  158. }
  159. // System.out.print ("[" + arr[i] + "] ");
  160. }
  161. if (flag == true)
  162. {
  163. System.out.print ("\n[SUCCESS]");
  164. }
  165. else
  166. {
  167. System.out.print ("\n[FAILED]");
  168. }
  169. System.out.print ("\n\n");
  170. }
  171. }
  172.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement