Advertisement
pouyappr

Quick

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