Advertisement
LynchzDEV

java sorting cheatsheet

Apr 20th, 2023 (edited)
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 35.80 KB | Source Code | 0 0
  1. package lynchz.datastruc;
  2.  
  3. import java.util.*;
  4.  
  5. public class Datastruc {
  6.  
  7.     public static void main(String[] args) {
  8.         sorting();
  9.     }
  10.  
  11.     public static void sorting() {
  12.         int n = 1000000;
  13.         int[] arr = new int[n];
  14.         Random random = new Random();
  15.         for (int i = 0; i < arr.length; i++) {
  16.             arr[i] = random.nextInt(n);
  17.         }
  18.  
  19.         // array.sort
  20.         long start = System.currentTimeMillis();
  21.         Arrays.sort(arr);
  22.         long end = System.currentTimeMillis();
  23.         System.out.println("Arrays.sort() takes " + (end - start) + "ms");
  24.  
  25.         // parallel sort
  26.         start = System.currentTimeMillis();
  27.         Arrays.parallelSort(arr);
  28.         end = System.currentTimeMillis();
  29.         System.out.println("Arrays.parallelSort() takes " + (end - start) + "ms");
  30.  
  31.         // bubblesort
  32.         start = System.currentTimeMillis();
  33.         bubbleSort(arr);
  34.         end = System.currentTimeMillis();
  35.         System.out.println("bubbleSort() takes " + (end - start) + "ms");
  36.  
  37.         // insertionsort
  38.         start = System.currentTimeMillis();
  39.         insertionSort(arr);
  40.         end = System.currentTimeMillis();
  41.         System.out.println("insertionSort() takes " + (end - start) + "ms");
  42.  
  43.         // selectionsort
  44.         start = System.currentTimeMillis();
  45.         selectionSort(arr);
  46.         end = System.currentTimeMillis();
  47.         System.out.println("selectionSort() takes " + (end - start) + "ms");
  48.  
  49.         // mergesort
  50.         start = System.currentTimeMillis();
  51.         mergeSort(arr);
  52.         end = System.currentTimeMillis();
  53.         System.out.println("mergeSort() takes " + (end - start) + "ms");
  54.  
  55.         // quicksort
  56.         start = System.currentTimeMillis();
  57.         quickSort(arr);
  58.         end = System.currentTimeMillis();
  59.         System.out.println("quickSort() takes " + (end - start) + "ms");
  60.  
  61.         // heapsort
  62.         start = System.currentTimeMillis();
  63.         heapSort(arr);
  64.         end = System.currentTimeMillis();
  65.         System.out.println("heapSort() takes " + (end - start) + "ms");
  66.  
  67.         // shellsort
  68.         start = System.currentTimeMillis();
  69.         shellSort(arr);
  70.         end = System.currentTimeMillis();
  71.         System.out.println("shellSort() takes " + (end - start) + "ms");
  72.  
  73.         // radixsort
  74.         start = System.currentTimeMillis();
  75.         radixSort(arr);
  76.         end = System.currentTimeMillis();
  77.         System.out.println("radixSort() takes " + (end - start) + "ms");
  78.  
  79.         // countingsort
  80.         start = System.currentTimeMillis();
  81.         countingSort(arr);
  82.         end = System.currentTimeMillis();
  83.         System.out.println("countingSort() takes " + (end - start) + "ms");
  84.  
  85.         // bucketsort
  86.         start = System.currentTimeMillis();
  87.         bucketSort(arr);
  88.         end = System.currentTimeMillis();
  89.         System.out.println("bucketSort() takes " + (end - start) + "ms");
  90.  
  91.         // combsort
  92.         start = System.currentTimeMillis();
  93.         combSort(arr);
  94.         end = System.currentTimeMillis();
  95.         System.out.println("combSort() takes " + (end - start) + "ms");
  96.  
  97.         // pigeonholeSort
  98.         start = System.currentTimeMillis();
  99.         pigeonholeSort(arr);
  100.         end = System.currentTimeMillis();
  101.         System.out.println("pigeonholeSort() takes " + (end - start) + "ms");
  102.  
  103.         // cocktailsort
  104.         start = System.currentTimeMillis();
  105.         cocktailSort(arr);
  106.         end = System.currentTimeMillis();
  107.         System.out.println("cocktailSort() takes " + (end - start) + "ms");
  108.  
  109.         // gnomeSort
  110.         start = System.currentTimeMillis();
  111.         gnomeSort(arr);
  112.         end = System.currentTimeMillis();
  113.         System.out.println("gnomeSort() takes " + (end - start) + "ms");
  114.  
  115.         // cycleSort
  116.         start = System.currentTimeMillis();
  117.         cycleSort(arr);
  118.         end = System.currentTimeMillis();
  119.         System.out.println("cycleSort() takes " + (end - start) + "ms");
  120.  
  121.         // pancakeSort
  122.         start = System.currentTimeMillis();
  123.         pancakeSort(arr);
  124.         end = System.currentTimeMillis();
  125.         System.out.println("pancakeSort() takes " + (end - start) + "ms");
  126.  
  127.         // bitonicSort
  128.         start = System.currentTimeMillis();
  129.         bitonicSort(arr, 0);
  130.         end = System.currentTimeMillis();
  131.         System.out.println("bitonicSort() takes " + (end - start) + "ms");
  132.  
  133.         // stoogeSort
  134.         start = System.currentTimeMillis();
  135.         stoogeSort(arr, 0, 0);
  136.         end = System.currentTimeMillis();
  137.         System.out.println("stoogeSort() takes " + (end - start) + "ms");
  138.  
  139.         // bogoSort
  140.         start = System.currentTimeMillis();
  141.         bogoSort(arr);
  142.         end = System.currentTimeMillis();
  143.         System.out.println("bogoSort() takes " + (end - start) + "ms");
  144.  
  145.         // beadSort
  146.         start = System.currentTimeMillis();
  147.         beadSort(arr);
  148.         end = System.currentTimeMillis();
  149.         System.out.println("beadSort() takes " + (end - start) + "ms");
  150.  
  151.         // blockSort
  152.         start = System.currentTimeMillis();
  153.         blockSort(arr);
  154.         end = System.currentTimeMillis();
  155.         System.out.println("blockSort() takes " + (end - start) + "ms");
  156.  
  157.         // flashSort
  158.         start = System.currentTimeMillis();
  159.         flashSort(arr);
  160.         end = System.currentTimeMillis();
  161.         System.out.println("flashSort() takes " + (end - start) + "ms");
  162.  
  163.         // smoothSort
  164.         start = System.currentTimeMillis();
  165.         smoothSort(arr);
  166.         end = System.currentTimeMillis();
  167.         System.out.println("smoothSort() takes " + (end - start) + "ms");
  168.  
  169.         // strandSort
  170.         start = System.currentTimeMillis();
  171.         strandSort(arr);
  172.         end = System.currentTimeMillis();
  173.         System.out.println("strandSort() takes " + (end - start) + "ms");
  174.     }
  175.  
  176.     static void bubbleSort(int[] arr) {
  177.         int n = arr.length;
  178.         int temp = 0;
  179.         for (int i = 0; i < n; i++) {
  180.             for (int j = 1; j < (n - i); j++) {
  181.                 if (arr[j - 1] > arr[j]) {
  182.                     // swap elements
  183.                     temp = arr[j - 1];
  184.                     arr[j - 1] = arr[j];
  185.                     arr[j] = temp;
  186.                 }
  187.  
  188.             }
  189.         }
  190.  
  191.     }
  192.  
  193.     static void insertionSort(int array[]) {
  194.         int n = array.length;
  195.         for (int j = 1; j < n; j++) {
  196.             int key = array[j];
  197.             int i = j - 1;
  198.             while ((i > -1) && (array[i] > key)) {
  199.                 array[i + 1] = array[i];
  200.                 i--;
  201.             }
  202.             array[i + 1] = key;
  203.         }
  204.     }
  205.  
  206.     static void selectionSort(int[] arr) {
  207.         for (int i = 0; i < arr.length - 1; i++) {
  208.             int index = i;
  209.             for (int j = i + 1; j < arr.length; j++) {
  210.                 if (arr[j] < arr[index]) {
  211.                     index = j;// searching for lowest index
  212.                 }
  213.             }
  214.             int smallerNumber = arr[index];
  215.             arr[index] = arr[i];
  216.             arr[i] = smallerNumber;
  217.         }
  218.     }
  219.  
  220.     static void mergeSort(int[] arr) {
  221.         if (arr.length > 1) {
  222.             // Merge sort the first half
  223.             int[] firstHalf = new int[arr.length / 2];
  224.             System.arraycopy(arr, 0, firstHalf, 0, arr.length / 2);
  225.             mergeSort(firstHalf);
  226.  
  227.             // Merge sort the second half
  228.             int secondHalfLength = arr.length - arr.length / 2;
  229.             int[] secondHalf = new int[secondHalfLength];
  230.             System.arraycopy(arr, arr.length / 2, secondHalf, 0, secondHalfLength);
  231.             mergeSort(secondHalf);
  232.  
  233.             // Merge firstHalf with secondHalf into arr
  234.             merge(firstHalf, secondHalf, arr);
  235.         }
  236.     }
  237.  
  238.             private static void merge(int[] firstHalf, int[] secondHalf, int[] arr) {
  239.                 int current1 = 0; // Current index in firstHalf
  240.                 int current2 = 0; // Current index in secondHalf
  241.                 int current3 = 0; // Current index in arr
  242.  
  243.                 while (current1 < firstHalf.length && current2 < secondHalf.length) {
  244.                     if (firstHalf[current1] < secondHalf[current2])
  245.                         arr[current3++] = firstHalf[current1++];
  246.                     else
  247.                         arr[current3++] = secondHalf[current2++];
  248.                 }
  249.  
  250.                 while (current1 < firstHalf.length)
  251.                     arr[current3++] = firstHalf[current1++];
  252.  
  253.                 while (current2 < secondHalf.length)
  254.                     arr[current3++] = secondHalf[current2++];
  255.             }
  256.  
  257.     static void quickSort(int[] arr) {
  258.         Stack<Integer> stack = new Stack<>();
  259.         stack.push(0); // Push the starting index of the array
  260.         stack.push(arr.length - 1); // Push the ending index of the array
  261.  
  262.         while (!stack.isEmpty()) {
  263.             int high = stack.pop(); // Pop the ending index of the subarray
  264.             int low = stack.pop(); // Pop the starting index of the subarray
  265.  
  266.             if (high > low) { // If there are at least two elements in the subarray
  267.                 int pivotIndex = partition(arr, low, high); // Partition the subarray around a pivot element
  268.                 stack.push(low); // Push the starting index of the left subarray
  269.                 stack.push(pivotIndex - 1); // Push the ending index of the left subarray
  270.                 stack.push(pivotIndex + 1); // Push the starting index of the right subarray
  271.                 stack.push(high); // Push the ending index of the right subarray
  272.             }
  273.         }
  274.     }
  275.  
  276.             private static int partition(int[] arr, int low, int high) {
  277.                 int pivot = arr[high]; // Choose the last element of the subarray as the pivot
  278.                 int i = low - 1; // Initialize the index of the smaller element
  279.  
  280.                 for (int j = low; j < high; j++) {
  281.                     if (arr[j] < pivot) { // If the current element is smaller than the pivot
  282.                         i++; // Increment the index of the smaller element
  283.                         int temp = arr[i]; // Swap arr[i] and arr[j]
  284.                         arr[i] = arr[j];
  285.                         arr[j] = temp;
  286.                     }
  287.                 }
  288.  
  289.                 int temp = arr[i + 1]; // Swap arr[i+1] and arr[high] (or the pivot)
  290.                 arr[i + 1] = arr[high];
  291.                 arr[high] = temp;
  292.  
  293.                 return i + 1; // Return the index of the pivot element
  294.             }
  295.  
  296.             static void heapSort(int[] arr) {
  297.                 // Create a Heap of integers
  298.                 Heap<Integer> heap = new Heap<Integer>();
  299.  
  300.                 // Add elements to the heap
  301.                 for (int i = 0; i < arr.length; i++)
  302.                     heap.add(arr[i]);
  303.  
  304.                 // Remove elements from the heap
  305.                 for (int i = arr.length - 1; i >= 0; i--)
  306.                     arr[i] = heap.remove();
  307.             }
  308.  
  309.             private static class Heap<E extends Comparable<E>> {
  310.                 private java.util.ArrayList<E> list = new java.util.ArrayList<E>();
  311.  
  312.                 /** Create a default heap */
  313.                 public Heap() {
  314.                 }
  315.  
  316.                 /** Create a heap from an array of objects */
  317.                 public Heap(E[] objects) {
  318.                     for (int i = 0; i < objects.length; i++)
  319.                         add(objects[i]);
  320.                 }
  321.  
  322.                 /** Add a new object into the heap */
  323.                 public void add(E newObject) {
  324.                     list.add(newObject); // Append to the heap
  325.                     int currentIndex = list.size() - 1; // The index of the last node
  326.  
  327.                     while (currentIndex > 0) {
  328.                         int parentIndex = (currentIndex - 1) / 2;
  329.                         // Swap if the current object is greater than its parent
  330.                         if (list.get(currentIndex).compareTo(
  331.                                 list.get(parentIndex)) > 0) {
  332.                             E temp = list.get(currentIndex);
  333.                             list.set(currentIndex, list.get(parentIndex));
  334.                             list.set(parentIndex, temp);
  335.                         } else
  336.                             break; // the tree is a heap now
  337.  
  338.                         currentIndex = parentIndex;
  339.                     }
  340.                 }
  341.  
  342.                 /** Remove the root from the heap */
  343.                 public E remove() {
  344.                     if (list.size() == 0)
  345.                         return null;
  346.  
  347.                     E removedObject = list.get(0);
  348.                     list.set(0, list.get(list.size() - 1));
  349.                     list.remove(list.size() - 1);
  350.  
  351.                     int currentIndex = 0;
  352.                     while (currentIndex < list.size()) {
  353.                         int leftChildIndex = 2 * currentIndex + 1;
  354.                         int rightChildIndex = 2 * currentIndex + 2;
  355.  
  356.                         // Find the maximum between two children
  357.                         if (leftChildIndex >= list.size())
  358.                             break; // The tree is a heap
  359.                         int maxIndex = leftChildIndex;
  360.                         if (rightChildIndex < list.size()) {
  361.                             if (list.get(maxIndex).compareTo(
  362.                                     list.get(rightChildIndex)) < 0) {
  363.                                 maxIndex = rightChildIndex;
  364.                             }
  365.                         }
  366.  
  367.                         // Swap if the current node is less than the maximum
  368.                         if (list.get(currentIndex).compareTo(
  369.                                 list.get(maxIndex)) < 0) {
  370.                             E temp = list.get(maxIndex);
  371.                             list.set(maxIndex, list.get(currentIndex));
  372.                             list.set(currentIndex, temp);
  373.                             currentIndex = maxIndex;
  374.                         } else
  375.                             break; // The tree is a heap
  376.                     }
  377.                     return removedObject;
  378.                 }
  379.     }
  380.  
  381.     static void shellSort(int[] arr) {
  382.         int n = arr.length;
  383.         int gap = n / 2;
  384.         while (gap > 0) {
  385.             for (int i = gap; i < n; i++) {
  386.                 int j = i;
  387.                 int temp = arr[i];
  388.                 while (j >= gap && arr[j - gap] > temp) {
  389.                     arr[j] = arr[j - gap];
  390.                     j -= gap;
  391.                 }
  392.                 arr[j] = temp;
  393.             }
  394.             gap /= 2;
  395.         }
  396.     }
  397.  
  398.     static void radixSort(int[] arr) {
  399.         // Find the largest number to know number of digits
  400.         int max = arr[0];
  401.         for (int i = 1; i < arr.length; i++)
  402.             if (arr[i] > max)
  403.                 max = arr[i];
  404.  
  405.         // Do counting sort for every digit. Note that instead
  406.         // of passing digit number, exp is passed. exp is 10^i
  407.         // where i is current digit number
  408.         for (int exp = 1; max / exp > 0; exp *= 10)
  409.             countingSort(arr, exp);
  410.     }
  411.  
  412.     private static void countingSort(int[] arr, int exp) {
  413.         int[] output = new int[arr.length]; // output array
  414.         int[] count = new int[10];
  415.         Arrays.fill(count, 0);
  416.  
  417.         // Store count of occurrences in count[]
  418.         for (int i = 0; i < arr.length; i++)
  419.             count[(arr[i] / exp) % 10]++;
  420.  
  421.         // Change count[i] so that count[i] now contains actual
  422.         // position of this digit in output[]
  423.         for (int i = 1; i < 10; i++)
  424.             count[i] += count[i - 1];
  425.  
  426.         // Build the output array
  427.         for (int i = arr.length - 1; i >= 0; i--) {
  428.             output[count[(arr[i] / exp) % 10] - 1] = arr[i];
  429.             count[(arr[i] / exp) % 10]--;
  430.         }
  431.  
  432.         // Copy the output array to arr[], so that arr[] now
  433.         // contains sorted numbers according to current digit
  434.         for (int i = 0; i < arr.length; i++)
  435.             arr[i] = output[i];
  436.     }
  437.  
  438.     static void countingSort(int[] arr) {
  439.         int max = arr[0];
  440.         int min = arr[0];
  441.         for (int i = 1; i < arr.length; i++) {
  442.             if (arr[i] > max)
  443.                 max = arr[i];
  444.             if (arr[i] < min)
  445.                 min = arr[i];
  446.         }
  447.  
  448.         int[] count = new int[max - min + 1];
  449.         for (int i = 0; i < arr.length; i++)
  450.             count[arr[i] - min]++;
  451.  
  452.         int z = 0;
  453.         for (int i = min; i <= max; i++)
  454.             while (count[i - min]-- > 0)
  455.                 arr[z++] = i;
  456.     }
  457.  
  458.     static void bucketSort(int[] arr) {
  459.         int maxVal = arr[0];
  460.         int minVal = arr[0];
  461.         for (int i = 1; i < arr.length; i++) {
  462.             if (arr[i] > maxVal)
  463.                 maxVal = arr[i];
  464.             if (arr[i] < minVal)
  465.                 minVal = arr[i];
  466.         }
  467.  
  468.         int bucketLen = (maxVal - minVal) / arr.length + 1;
  469.         ArrayList<ArrayList<Integer>> buckets = new ArrayList<ArrayList<Integer>>(bucketLen);
  470.         for (int i = 0; i < bucketLen; i++) {
  471.             buckets.add(new ArrayList<Integer>());
  472.         }
  473.  
  474.         // distribute the numbers into buckets
  475.         for (int i = 0; i < arr.length; i++) {
  476.             buckets.get((arr[i] - minVal) / arr.length).add(arr[i]);
  477.         }
  478.  
  479.         // sort each bucket
  480.         for (int i = 0; i < buckets.size(); i++) {
  481.             Collections.sort(buckets.get(i));
  482.         }
  483.  
  484.         // concatenate the result
  485.         int idx = 0;
  486.         for (int i = 0; i < buckets.size(); i++) {
  487.             for (int j = 0; j < buckets.get(i).size(); j++) {
  488.                 arr[idx++] = buckets.get(i).get(j);
  489.             }
  490.         }
  491.     }
  492.  
  493.     static void combSort(int[] arr) {
  494.         int gap = arr.length;
  495.         boolean swapped = true;
  496.         while (gap != 1 || swapped) {
  497.             // Find next gap
  498.             gap = getNextGap(gap);
  499.  
  500.             // Initialize swapped as false so that we can
  501.             // check if swap happened or not
  502.             swapped = false;
  503.  
  504.             // Compare all elements with current gap
  505.             for (int i = 0; i < arr.length - gap; i++) {
  506.                 if (arr[i] > arr[i + gap]) {
  507.                     // Swap arr[i] and arr[i+gap]
  508.                     int temp = arr[i];
  509.                     arr[i] = arr[i + gap];
  510.                     arr[i + gap] = temp;
  511.  
  512.                     // Set swapped
  513.                     swapped = true;
  514.                 }
  515.             }
  516.         }
  517.     }
  518.  
  519.             private static int getNextGap(int gap) {
  520.                 // Shrink gap by Shrink factor
  521.                 gap = (gap * 10) / 13;
  522.  
  523.                 if (gap < 1)
  524.                     return 1;
  525.                 return gap;
  526.             }
  527.  
  528.     static void pigeonholeSort(int[] arr) {
  529.         int min = arr[0];
  530.         int max = arr[0];
  531.         int range, i, j, index;
  532.  
  533.         for (int a = 0; a < arr.length; a++) {
  534.             if (arr[a] > max)
  535.                 max = arr[a];
  536.             if (arr[a] < min)
  537.                 min = arr[a];
  538.         }
  539.  
  540.         range = max - min + 1;
  541.         int[] phole = new int[range];
  542.         Arrays.fill(phole, 0);
  543.  
  544.         for (i = 0; i < arr.length; i++)
  545.             phole[arr[i] - min]++;
  546.  
  547.         index = 0;
  548.  
  549.         for (j = 0; j < range; j++)
  550.             while (phole[j]-- > 0)
  551.                 arr[index++] = j + min;
  552.  
  553.     }
  554.  
  555.     static void cocktailSort(int[] arr) {
  556.         boolean swapped = true;
  557.         int start = 0;
  558.         int end = arr.length;
  559.  
  560.         while (swapped == true) {
  561.             // reset the swapped flag on entering the loop,
  562.             // because it might be true from a previous
  563.             // iteration.
  564.             swapped = false;
  565.  
  566.             // loop from left to right same as the bubble
  567.             // sort
  568.             for (int i = start; i < end - 1; ++i) {
  569.                 if (arr[i] > arr[i + 1]) {
  570.                     int temp = arr[i];
  571.                     arr[i] = arr[i + 1];
  572.                     arr[i + 1] = temp;
  573.                     swapped = true;
  574.                 }
  575.             }
  576.  
  577.             // if nothing moved, then array is sorted.
  578.             if (swapped == false)
  579.                 break;
  580.  
  581.             // otherwise, reset the swapped flag so that it
  582.             // can be used in the next stage
  583.             swapped = false;
  584.  
  585.             // move the end point back by one, because
  586.             // item at the end is in its rightful spot
  587.             end = end - 1;
  588.  
  589.             // from right to left, doing the
  590.             // same comparison as in the previous stage
  591.             for (int i = end - 1; i >= start; i--) {
  592.                 if (arr[i] > arr[i + 1]) {
  593.                     int temp = arr[i];
  594.                     arr[i] = arr[i + 1];
  595.                     arr[i + 1] = temp;
  596.                     swapped = true;
  597.                 }
  598.             }
  599.  
  600.             // increase the starting point, because
  601.             // the last stage would have moved the next
  602.             // smallest number to its rightful spot.
  603.             start = start + 1;
  604.         }
  605.     }
  606.  
  607.     static void gnomeSort(int[] arr) {
  608.         int index = 0;
  609.  
  610.         while (index < arr.length) {
  611.             if (index == 0)
  612.                 index++;
  613.             if (arr[index] >= arr[index - 1])
  614.                 index++;
  615.             else {
  616.                 int temp = 0;
  617.                 temp = arr[index];
  618.                 arr[index] = arr[index - 1];
  619.                 arr[index - 1] = temp;
  620.                 index--;
  621.             }
  622.         }
  623.         return;
  624.     }
  625.  
  626.     static void cycleSort(int[] arr) {
  627.         int writes = 0;
  628.  
  629.         // Loop through the array to find cycles to rotate.
  630.         for (int cycleStart = 0; cycleStart <= arr.length - 2; cycleStart++) {
  631.             // initialize item as starting point.
  632.             int item = arr[cycleStart];
  633.  
  634.             // Find where to put the item.
  635.             int pos = cycleStart;
  636.             for (int i = cycleStart + 1; i < arr.length; i++)
  637.                 if (arr[i] < item)
  638.                     pos++;
  639.  
  640.             // If the item is already there, this is not a cycle.
  641.             if (pos == cycleStart)
  642.                 continue;
  643.  
  644.             // Otherwise, put the item there or right after any duplicates.
  645.             while (item == arr[pos])
  646.                 pos += 1;
  647.             int temp = item;
  648.             item = arr[pos];
  649.             arr[pos] = temp;
  650.             writes++;
  651.  
  652.             // Rotate the rest of the cycle.
  653.             while (pos != cycleStart) {
  654.                 pos = cycleStart;
  655.  
  656.                 // Find where to put the item.
  657.                 for (int i = cycleStart + 1; i < arr.length; i++)
  658.                     if (arr[i] < item)
  659.                         pos += 1;
  660.  
  661.                 // Put the item there or right after any duplicates.
  662.                 while (item == arr[pos])
  663.                     pos += 1;
  664.                 temp = item;
  665.                 item = arr[pos];
  666.                 arr[pos] = temp;
  667.                 writes++;
  668.             }
  669.         }
  670.     }
  671.  
  672.     static void pancakeSort(int[] arr) {
  673.         // Start from the complete array and one by one
  674.         // reduce current size by one
  675.         for (int curr_size = arr.length; curr_size > 1; --curr_size) {
  676.             // Find index of the maximum element in
  677.             // arr[0..curr_size-1]
  678.             int mi = findMax(arr, curr_size);
  679.  
  680.             // Move the maximum element to end of current
  681.             // array if it's not already at the end
  682.             if (mi != curr_size - 1) {
  683.                 // To move at the end, first move maximum
  684.                 // number to beginning
  685.                 flip(arr, mi);
  686.  
  687.                 // Now move the maximum number to end by
  688.                 // reversing current array
  689.                 flip(arr, curr_size - 1);
  690.             }
  691.         }
  692.     }
  693.  
  694.             private static int findMax(int[] arr, int curr_size) {
  695.                 int mi, i;
  696.                 for (mi = 0, i = 0; i < curr_size; ++i)
  697.                     if (arr[i] > arr[mi])
  698.                         mi = i;
  699.                 return mi;
  700.             }
  701.  
  702.             private static void flip(int[] arr, int i) {
  703.                 int temp, start = 0;
  704.                 while (start < i) {
  705.                     temp = arr[start];
  706.                     arr[start] = arr[i];
  707.                     arr[i] = temp;
  708.                     start++;
  709.                     i--;
  710.                 }
  711.             }
  712.  
  713.     static void bitonicSort(int[] arr, int up) {
  714.         // Start the bitonic merge process with the entire array
  715.         // up is 1 for ascending and 0 for descending
  716.         bitonicMerge(arr, 0, arr.length, up);
  717.     }
  718.  
  719.             private static void bitonicMerge(int[] arr, int low, int cnt, int up) {
  720.                 if (cnt > 1) {
  721.                     int k = cnt / 2;
  722.  
  723.                     // Compare and swap elements in the left and right subarrays
  724.                     for (int i = low; i < low + k; i++)
  725.                         compAndSwap(arr, i, i + k, up);
  726.  
  727.                     // Recursively merge the left and right subarrays
  728.                     bitonicMerge(arr, low, k, up);
  729.                     bitonicMerge(arr, low + k, k, up);
  730.                 }
  731.             }
  732.  
  733.             private static void compAndSwap(int[] arr, int i, int j, int up) {
  734.                 if ((arr[i] > arr[j] && up == 1) || (arr[i] < arr[j] && up == 0)) {
  735.                     // Swap the elements if they are out of order based on the value of the 'up'
  736.                     // flag
  737.                     int temp = arr[i];
  738.                     arr[i] = arr[j];
  739.                     arr[j] = temp;
  740.                 }
  741.             }
  742.  
  743.     static void stoogeSort(int[] arr, int l, int h) {
  744.         if (l >= h)
  745.             return;
  746.  
  747.         // If first element is smaller than last, swap them
  748.         if (arr[l] > arr[h]) {
  749.             int temp = arr[l];
  750.             arr[l] = arr[h];
  751.             arr[h] = temp;
  752.         }
  753.  
  754.         // If there are more than 2 elements in the array
  755.         if (h - l + 1 > 2) {
  756.             int t = (h - l + 1) / 3;
  757.  
  758.             // Recursively sort first 2/3 elements
  759.             stoogeSort(arr, l, h - t);
  760.  
  761.             // Recursively sort last 2/3 elements
  762.             stoogeSort(arr, l + t, h);
  763.  
  764.             // Recursively sort first 2/3 elements again to confirm
  765.             stoogeSort(arr, l, h - t);
  766.         }
  767.     }
  768.  
  769.     static void bogoSort(int[] arr) {
  770.         // if array is not sorted then shuffle the
  771.         // array again
  772.         while (isSorted(arr) == false)
  773.             shuffle(arr);
  774.     }
  775.  
  776.             private static boolean isSorted(int[] arr) {
  777.                 // check if array is sorted or not
  778.                 for (int i = 0; i < arr.length - 1; i++)
  779.                     if (arr[i] > arr[i + 1])
  780.                         return false;
  781.                 return true;
  782.             }
  783.  
  784.             private static void shuffle(int[] arr) {
  785.                 // Math.random() returns a double positive
  786.                 // value, greater than or equal to 0.0 and
  787.                 // less than 1.0.
  788.                 for (int i = 0; i < arr.length; i++) {
  789.                     int r = (int) (Math.random() * (arr.length - i));
  790.                     int temp = arr[i];
  791.                     arr[i] = arr[r];
  792.                     arr[r] = temp;
  793.                 }
  794.     }
  795.  
  796.     static void beadSort(int[] arr) {
  797.         int max = arr[0];
  798.         for (int i = 1; i < arr.length; i++)
  799.             if (arr[i] > max)
  800.                 max = arr[i];
  801.  
  802.         // Create an array of beads, each bead
  803.         // being 1 unit long
  804.         int[][] beads = new int[max][arr.length];
  805.  
  806.         // Mark the beads
  807.         for (int i = 0; i < arr.length; i++)
  808.             for (int j = 0; j < arr[i]; j++)
  809.                 beads[j][i] = 1;
  810.  
  811.         // Put the beads in order
  812.         for (int i = 0; i < max; i++)
  813.             for (int j = 0, sum = 0; j < arr.length; j++) {
  814.                 sum += beads[i][j];
  815.                 beads[i][j] = 0;
  816.                 arr[j] = sum;
  817.             }
  818.     }
  819.  
  820.     static void blockSort(int[] arr) {
  821.         // Find the maximum value in arr[]
  822.         int n = arr.length;
  823.         int max = arr[0];
  824.         int min = arr[0];
  825.         for (int i = 1; i < n; i++) {
  826.             if (arr[i] > max)
  827.                 max = arr[i];
  828.             if (arr[i] < min)
  829.                 min = arr[i];
  830.         }
  831.         int range = max - min + 1;
  832.  
  833.         // Create an array of vectors. Size of
  834.         // array is equal to range. Each vector
  835.         // represents a bucket.
  836.         @SuppressWarnings("unchecked")
  837.         Vector<Integer>[] bucket = new Vector[range];
  838.  
  839.         // Initialize each bucket
  840.         for (int i = 0; i < bucket.length; i++)
  841.             bucket[i] = new Vector<>();
  842.  
  843.         // Traverse the input array and put every
  844.         // element in its respective bucket
  845.         for (int i = 0; i < n; i++) {
  846.             bucket[arr[i] - min].add(arr[i]);
  847.         }
  848.  
  849.         // Traverse the buckets and put all elements
  850.         // back into arr[]
  851.         int index = 0;
  852.         for (int i = 0; i < bucket.length; i++) {
  853.             for (int j = 0; j < bucket[i].size(); j++) {
  854.                 arr[index++] = bucket[i].get(j);
  855.             }
  856.         }
  857.     }
  858.  
  859.     static void flashSort(int[] arr) {
  860.         int n = arr.length;
  861.         int m = (int) (0.45 * n);
  862.         int[] l = new int[m];
  863.  
  864.         for (int i = 0; i < m; i++)
  865.             l[i] = 0;
  866.  
  867.         // Find the maximum and minimum values
  868.         int max = arr[0];
  869.         int min = arr[0];
  870.         for (int i = 1; i < n; i++) {
  871.             if (arr[i] > max)
  872.                 max = arr[i];
  873.             if (arr[i] < min)
  874.                 min = arr[i];
  875.         }
  876.  
  877.         // Find the range
  878.         int range = max - min;
  879.  
  880.         // Find the flash value
  881.         int flash = (int) (m - 1) / range;
  882.  
  883.         // Distribute the elements
  884.         for (int i = 0; i < n; i++) {
  885.             int index = (int) (flash * (arr[i] - min));
  886.             l[index]++;
  887.         }
  888.  
  889.         // Find the cumulative distribution
  890.         for (int i = 1; i < m; i++)
  891.             l[i] += l[i - 1];
  892.  
  893.         // Shift the elements
  894.         int hold = arr[n - 1];
  895.         int j = 0;
  896.         int k = m - 1;
  897.         int move = 0;
  898.         while (move < (n - 1)) {
  899.             while (j > (l[k] - 1)) {
  900.                 j++;
  901.                 k = (int) (flash * (arr[j] - min));
  902.             }
  903.             hold = arr[j];
  904.             while (j == l[k]) {
  905.                 k = (int) (flash * (hold - min));
  906.                 int temp = arr[l[k] - 1];
  907.                 arr[l[k] - 1] = hold;
  908.                 hold = temp;
  909.                 l[k]--;
  910.                 move++;
  911.             }
  912.         }
  913.     }
  914.  
  915.     static void smoothSort(int[] arr) {
  916.         int n = arr.length; // Get the length of the array
  917.         int temp; // Declare a temporary variable for swapping values
  918.  
  919.         // Sort pairs of elements in the array in ascending order
  920.         for (int i = 0; i < n; i += 2) {
  921.             // Swap the values of the current element and the previous element if the
  922.             // previous element is greater
  923.             if (i != 0 && arr[i] < arr[i - 1]) {
  924.                 temp = arr[i];
  925.                 arr[i] = arr[i - 1];
  926.                 arr[i - 1] = temp;
  927.             }
  928.             // Swap the values of the current element and the next element if the next
  929.             // element is smaller
  930.             if (i != n - 1 && arr[i] > arr[i + 1]) {
  931.                 temp = arr[i];
  932.                 arr[i] = arr[i + 1];
  933.                 arr[i + 1] = temp;
  934.             }
  935.         }
  936.  
  937.         boolean isSorted = false; // Set a flag to track whether the array is sorted
  938.  
  939.         // Keep sorting the array until it is fully sorted
  940.         while (!isSorted) {
  941.             isSorted = true; // Assume the array is sorted initially
  942.  
  943.             // Sort sub-arrays of increasing size using the "smoothsort" algorithm
  944.             for (int i = 1; i <= n - 2; i = 2 * i) { // i is the size of the sub-array being sorted
  945.                 for (int j = 0; j < n - 2; j += 2 * i) { // j is the starting index of the sub-array
  946.                     int sub_array_length = 2 * i; // Length of the sub-array
  947.                     int sub_array_middle = j + i - 1; // Middle index of the sub-array
  948.                     int k = 0; // Index of the sorted array
  949.                     int left = j; // Starting index of the left sub-array
  950.                     int right = j + i; // Starting index of the right sub-array
  951.                     int[] sorted = new int[sub_array_length]; // Temporary array to hold the sorted values
  952.  
  953.                     // Merge the two sub-arrays into the sorted array
  954.                     while (left <= sub_array_middle && right <= (j + sub_array_length - 1)) {
  955.                         if (arr[left] < arr[right]) {
  956.                             sorted[k] = arr[left];
  957.                             left++;
  958.                         } else {
  959.                             sorted[k] = arr[right];
  960.                             right++;
  961.                         }
  962.                         k++;
  963.                     }
  964.                     // Add any remaining values from the left sub-array to the sorted array
  965.                     if (left > sub_array_middle) {
  966.                         for (int l = right; l <= (j + sub_array_length - 1); l++) {
  967.                             sorted[k] = arr[l];
  968.                             k++;
  969.                         }
  970.                     }
  971.                     // Add any remaining values from the right sub-array to the sorted array
  972.                     else {
  973.                         for (int l = left; l <= sub_array_middle; l++) {
  974.                             sorted[k] = arr[l];
  975.                             k++;
  976.                         }
  977.                     }
  978.  
  979.                     // Copy the sorted values back into the original array
  980.                     for (int l = j; l <= (j + sub_array_length - 1); l++) {
  981.                         arr[l] = sorted[l - j];
  982.                     }
  983.                 }
  984.             }
  985.         }
  986.     }
  987.  
  988.     static void strandSort(int[] arr) {
  989.         // Get the length of the input array
  990.         int n = arr.length;
  991.         // Create a temporary array to store the input array
  992.         int[] temp = new int[n];
  993.         // Create a sorted array to keep track of which elements have been sorted
  994.         int[] sorted = new int[n];
  995.         // Initialize the temporary array with the input array, and set all elements in
  996.         // the sorted array to 0
  997.         int index = 0;
  998.         for (int i = 0; i < n; i++) {
  999.             temp[i] = arr[i];
  1000.             sorted[i] = 0;
  1001.         }
  1002.         // Continue iterating until all elements have been sorted
  1003.         while (index != n) {
  1004.             // Get the index of the minimum element in the temporary array that hasn't been
  1005.             // sorted yet
  1006.             int min_index = getMin(temp, sorted);
  1007.             // Add the minimum element to the output array, and mark it as sorted
  1008.             arr[index] = temp[min_index];
  1009.             sorted[min_index] = 1;
  1010.             index++;
  1011.         }
  1012.     }
  1013.  
  1014.             // Helper function to get the index of the minimum element in an array that
  1015.             // hasn't been sorted yet
  1016.             private static int getMin(int[] temp, int[] sorted) {
  1017.                 // Initialize the minimum value to the maximum possible integer value, and the
  1018.                 // index to -1
  1019.                 int min = Integer.MAX_VALUE;
  1020.                 int index = -1;
  1021.                 // Iterate through the array and find the minimum value that hasn't been sorted
  1022.                 // yet
  1023.                 for (int i = 0; i < temp.length; i++) {
  1024.                     if (temp[i] < min && sorted[i] == 0) {
  1025.                         min = temp[i];
  1026.                         index = i;
  1027.                     }
  1028.                 }
  1029.                 // Return the index of the minimum element
  1030.                 return index;
  1031.     }
  1032.  
  1033. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement