Advertisement
pouyappr

quicksort_M

Mar 16th, 2022
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.01 KB | None | 0 0
  1. import java.util.Arrays;
  2.  
  3. public class Main {
  4.  
  5.     public static void main(String[] args) {
  6.         int[] a = new int[]{1000, 10, 7, 8, 9, 30, 900, 1, 5, 6, 20};
  7.         quickSort(a,0,a.length-1);
  8.         System.out.println(Arrays.toString(a));
  9.  
  10.     }
  11.  
  12.     public static void quickSort(int[] arr,int l,int h){
  13.         if (l < h){
  14.             int n = h-l+1;
  15.             int med = kthSmallest(arr,l,h,n/2);
  16.             int p = partition(arr,l,h,med);
  17.  
  18.             quickSort(arr,l,p-1);
  19.             quickSort(arr,p+1,h);
  20.         }
  21.     }
  22.  
  23.     private static int partition(int[] arr, int l, int r, int x) {
  24.         int i;
  25.         for (i=l; i<r; i++)
  26.             if (arr[i] == x)
  27.                 break;
  28.         swap(arr,i,r);
  29.         i = l;
  30.         for (int j = l; j <= r - 1; j++)
  31.         {
  32.             if (arr[j] <= x)
  33.             {
  34.                 swap(arr,i,j);
  35.                 i++;
  36.             }
  37.         }
  38.         swap(arr,i,r);
  39.         return i;
  40.     }
  41.  
  42.     private static void swap(int[] arr, int i, int r) {
  43.         int t = arr[i];
  44.         arr[i] = arr[r];
  45.         arr[r] = t;
  46.     }
  47.  
  48.     private static int kthSmallest(int[] arr, int l, int r, int k) {
  49.         if (k > 0 && k <= r - l + 1)
  50.         {
  51.             int n = r-l+1;
  52.             int i;
  53.             int[] median = new int[(n+4)/5];
  54.             for (i=0; i<n/5; i++)
  55.                 median[i] = findMedian(arr,i*5, 5);
  56.             {
  57.                 median[i] = findMedian(arr,i*5, n%5);
  58.                 i++;
  59.             }
  60.  
  61.             int medOfMed = (i == 1)? median[i-1]:
  62.                     kthSmallest(median, 0, i-1, i/2);
  63.  
  64.             int pos = partition(arr, l, r, medOfMed);
  65.  
  66.             if (pos-l == k-1)
  67.                 return arr[pos];
  68.             if (pos-l > k-1)
  69.                 return kthSmallest(arr, l, pos-1, k);
  70.  
  71.             return kthSmallest(arr, pos+1, r, k-pos+l-1);
  72.         }
  73.        
  74.         return Integer.MAX_VALUE;
  75.     }
  76.  
  77.     private static int findMedian(int[] arr, int start, int len) {
  78.         Arrays.sort(arr,start,start+len);
  79.         return arr[start+len/2];
  80.     }
  81. }
  82.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement