java: Sorting Algorithms

 

/**
 * encoding: utf-8
 * 版权所有 2024 ©涂聚文有限公司
 * 许可信息查看:
 * 描述:
 * # Author    : geovindu,Geovin Du 涂聚文.
 * # IDE       : IntelliJ IDEA 2023.1 Java 17
 * # Datetime  : 2024 - 2024/5/20 - 14:43
 * # User      : geovindu
 * # Product   : IntelliJ IDEA
 * # Project   : EssentialAlgorithms
 * # File      : Person.java
 * # explain   : 学习  类
 **/

package Model;

/**
 * 实体类
 * 人
 */
public class Person {

    private int id;
    private float salary;
    private Object someBigObject = new Object();

    /**
     * 
     * @param id
     * @param salary
     */
    public Person(int id, float salary)
    {
        this.id = id;
        this.salary = salary;
    }

    /**
     * 
     * @return
     */
    public float getSalary()
    {
        return salary;
    }

    @Override
    public String toString()
    {
        return "Person{" +
                "id=" + id +
                ", salary=" + salary +
                ", someBigObject=" + someBigObject +
                '}';
    }

}

  

/**
 * encoding: utf-8
 * 版权所有 2024 ©涂聚文有限公司
 * 许可信息查看:
 * 描述:
 * # Author    : geovindu,Geovin Du 涂聚文.
 * # IDE       : IntelliJ IDEA 2023.1 Java 17
 * # Datetime  : 2024 - 2024/5/20 - 14:49
 * # User      : geovindu
 * # Product   : IntelliJ IDEA
 * # Project   : EssentialAlgorithms
 * # File      : Node.java
 * # explain   : 学习  类
 **/

package Model;

/**
 * 实体类
 * 节点
 *
 */
public class Node {

    public int key;
    public Node left, right;

    /**
     *
     * @param item
     */
    public Node(int item)
    {
        key = item;
        left = right = null;
    }



}

  

 

 

/**
 * encoding: utf-8
 * 版权所有 2023 ©涂聚文有限公司
 * 许可信息查看: https://www.geeksforgeeks.org/sorting-algorithms/
 * 
 * 描述: https://www.programiz.com/dsa/insertion-sort
 * # Author    : geovindu,Geovin Du 涂聚文. *
 * # IDE       : IntelliJ IDEA 2023.1 Java 21
 * # Datetime  : 2023 - 2023/9/28 - 9:55
 * # User      : geovindu
 * # Product   : IntelliJ IDEA
 * # Project   : EssentialAlgorithms
 * # File      : SortingAlgorithm.java
 * # explain   : 学习  Sorting Algorithms 类
 **/

package SortingAlgorithms;
import java.lang.*;
import java.util.*;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;

import Model.Person;
import Model.Node;


public class SortingAlgorithm {



    /**
     *  1。Bubble Sort冒泡排序法
     * @param array 整数数组
     *
     * */
    public static void BubbleSort(int array[]) {

        int size = array.length;

        // loop to access each array element
        for (int i = 0; i < size - 1; i++)

            // loop to compare array elements
            for (int j = 0; j < size - i - 1; j++)

                // compare two adjacent elements
                // change > to < to sort in descending order
                if (array[j] > array[j + 1]) {

                    // swapping occurs if elements
                    // are not in the intended order
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
    }

    /**
     * 2 Selection Sort 选择排序
     * @param array 整数数组
     */
    public static void SelectionSort(int array[]) {
        int size = array.length;

        for (int step = 0; step < size - 1; step++) {
            int min_idx = step;

            for (int i = step + 1; i < size; i++) {

                // To sort in descending order, change > to < in this line.
                // Select the minimum element in each loop.
                if (array[i] < array[min_idx]) {
                    min_idx = i;
                }
            }

            // put min at the correct position
            int temp = array[step];
            array[step] = array[min_idx];
            array[min_idx] = temp;
        }
     }
     /**
     * 3.Insertion Sort 插入排序
     * @param array 整数数组
     * */
      public static void InsertionSort(int array[]) {
        int size = array.length;

        for (int step = 1; step < size; step++) {
            int key = array[step];
            int j = step - 1;

            // Compare key with each element on the left of it until an element smaller than
            // it is found.
            // For descending order, change key<array[j] to key>array[j].
            while (j >= 0 && key < array[j]) {
                array[j + 1] = array[j];
                --j;
            }

            // Place key at after the element just smaller than it.
            array[j + 1] = key;
        }
      }

    /**
     *
     * @param arr
     * @param p
     * @param q
     * @param r
     */
     private static void merge(int arr[], int p, int q, int r) {

        // Create L ← A[p..q] and M ← A[q+1..r]
        int n1 = q - p + 1;
        int n2 = r - q;

        int L[] = new int[n1];
        int M[] = new int[n2];

        for (int i = 0; i < n1; i++)
            L[i] = arr[p + i];
        for (int j = 0; j < n2; j++)
            M[j] = arr[q + 1 + j];

        // Maintain current index of sub-arrays and main array
        int i, j, k;
        i = 0;
        j = 0;
        k = p;

        // Until we reach either end of either L or M, pick larger among
        // elements L and M and place them in the correct position at A[p..r]
        while (i < n1 && j < n2) {
            if (L[i] <= M[j]) {
                arr[k] = L[i];
                i++;
            } else {
                arr[k] = M[j];
                j++;
            }
            k++;
        }

        // When we run out of elements in either L or M,
        // pick up the remaining elements and put in A[p..r]
        while (i < n1) {
            arr[k] = L[i];
            i++;
            k++;
        }

        while (j < n2) {
            arr[k] = M[j];
            j++;
            k++;
        }
    }

    /**
     * Divide the array into two subarrays, sort them and merge them
     * 4 Merge Sort 合并/归并排序
     * @param arr
     * @param l
     * @param r
     */
    public static  void mergeSort(int arr[], int l, int r) {
        if (l < r) {

            // m is the point where the array is divided into two subarrays
            int m = (l + r) / 2;

            mergeSort(arr, l, m);
            mergeSort(arr, m + 1, r);

            // Merge the sorted subarrays
            merge(arr, l, m, r);
        }
    }

    /**
     * method to find the partition position
     * @param array
     * @param low
     * @param high
     * @return
     */
    static int partition(int array[], int low, int high) {

        // choose the rightmost element as pivot
        int pivot = array[high];

        // pointer for greater element
        int i = (low - 1);

        // traverse through all elements
        // compare each element with pivot
        for (int j = low; j < high; j++) {
            if (array[j] <= pivot) {

                // if element smaller than pivot is found
                // swap it with the greatr element pointed by i
                i++;

                // swapping element at i with element at j
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }

        }

        // swapt the pivot element with the greater element specified by i
        int temp = array[i + 1];
        array[i + 1] = array[high];
        array[high] = temp;

        // return the position from where partition is done
        return (i + 1);
    }

    /**
     * 5 Quick Sort 快速排序
     * @param array 数组
     * @param low 开始
     * @param high 始束(长度)
     */
    public static void quickSort(int array[], int low, int high) {
        if (low < high) {

            // find pivot element such that
            // elements smaller than pivot are on the left
            // elements greater than pivot are on the right
            int pi = partition(array, low, high);

            // recursive call on the left of pivot
            quickSort(array, low, pi - 1);

            // recursive call on the right of pivot
            quickSort(array, pi + 1, high);
        }
    }


    /**
     * 6 Counting Sort 计数排序
     * @param array 数组
     * @param size 长度
     */
    public static  void countSort(int array[], int size) {
        int[] output = new int[size + 1];

        // Find the largest element of the array
        int max = array[0];
        for (int i = 1; i < size; i++) {
            if (array[i] > max)
                max = array[i];
        }
        int[] count = new int[max + 1];

        // Initialize count array with all zeros.
        for (int i = 0; i < max; ++i) {
            count[i] = 0;
        }

        // Store the count of each element
        for (int i = 0; i < size; i++) {
            count[array[i]]++;
        }

        // Store the cummulative count of each array
        for (int i = 1; i <= max; i++) {
            count[i] += count[i - 1];
        }

        // Find the index of each element of the original array in count array, and
        // place the elements in output array
        for (int i = size - 1; i >= 0; i--) {
            output[count[array[i]] - 1] = array[i];
            count[array[i]]--;
        }

        // Copy the sorted elements into original array
        for (int i = 0; i < size; i++) {
            array[i] = output[i];
        }
    }

    /**
     *
     * @param array
     * @param size
     * @param place
     */
    static void countingSort(int array[], int size, int place) {
        int[] output = new int[size + 1];
        int max = array[0];
        for (int i = 1; i < size; i++) {
            if (array[i] > max)
                max = array[i];
        }
        int[] count = new int[max + 1];

        for (int i = 0; i < max; ++i)
            count[i] = 0;

        // Calculate count of elements
        for (int i = 0; i < size; i++)
            count[(array[i] / place) % 10]++;

        // Calculate cumulative count
        for (int i = 1; i < 10; i++)
            count[i] += count[i - 1];

        // Place the elements in sorted order
        for (int i = size - 1; i >= 0; i--) {
            output[count[(array[i] / place) % 10] - 1] = array[i];
            count[(array[i] / place) % 10]--;
        }

        for (int i = 0; i < size; i++)
            array[i] = output[i];
    }

    /**
     * Function to get the largest element from an array
     * @param array
     * @param n
     * @return
     */
    static int getMax(int array[], int n) {
        int max = array[0];
        for (int i = 1; i < n; i++)
            if (array[i] > max)
                max = array[i];
        return max;
    }

    /**
     * Main function to implement radix sort
     * 7 Radix Sort 基数排序
     * @param array
     * @param size
     */
    public static void radixSort(int array[], int size) {
        // Get maximum element
        int max = getMax(array, size);

        // Apply counting sort to sort elements based on place value.
        for (int place = 1; max / place > 0; place *= 10)
            countingSort(array, size, place);
    }

    /**
     * 8 Bucket Sort 桶排序
     * @param arr
     * @param n
     */
    public void bucketSort(float[] arr, int n) {
        if (n <= 0)
            return;
        @SuppressWarnings("unchecked")
        ArrayList<Float>[] bucket = new ArrayList[n];

        // Create empty buckets
        for (int i = 0; i < n; i++)
            bucket[i] = new ArrayList<Float>();

        // Add elements into the buckets
        for (int i = 0; i < n; i++) {
            int bucketIndex = (int) arr[i] * n;
            bucket[bucketIndex].add(arr[i]);
        }

        // Sort the elements of each bucket
        for (int i = 0; i < n; i++) {
            Collections.sort((bucket[i]));
        }

        // Get the sorted array
        int index = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0, size = bucket[i].size(); j < size; j++) {
                arr[index++] = bucket[i].get(j);
            }
        }
    }

    /**
     *  9 Heap Sort 堆排序
     * @param arr
     */
    public static void heapifySort(int arr[]) {
        int n = arr.length;

        // Build max heap
        for (int i = n / 2 - 1; i >= 0; i--) {
            heapify(arr, n, i);
        }

        // Heap sort
        for (int i = n - 1; i >= 0; i--) {
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;

            // Heapify root element
            heapify(arr, i, 0);
        }
    }

    /**
     *
     * @param arr
     * @param n
     * @param i
     */
    static void heapify(int arr[], int n, int i) {
        // Find largest among root, left child and right child
        int largest = i;
        int l = 2 * i + 1;
        int r = 2 * i + 2;

        if (l < n && arr[l] > arr[largest])
            largest = l;

        if (r < n && arr[r] > arr[largest])
            largest = r;

        // Swap and continue heapifying if root is not largest
        if (largest != i) {
            int swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;

            heapify(arr, n, largest);
        }
    }

    /**
     * 10 Shell Sort 希尔排序
     * @param array
     * @param n
     */
    public static void shellSort(int array[], int n) {

        for (int interval = n / 2; interval > 0; interval /= 2) {
            for (int i = interval; i < n; i += 1) {
                int temp = array[i];
                int j;
                for (j = i; j >= interval && array[j - interval] > temp; j -= interval) {
                    array[j] = array[j - interval];
                }
                array[j] = temp;
            }
        }
    }

    /**
     * 11 Linear Search线性搜索
     * @param array
     * @param x
     * @return
     */
    public static int linearSearch(int array[], int x) {
        int n = array.length;

        // Going through array sequencially
        for (int i = 0; i < n; i++) {
            if (array[i] == x)
                return i;
        }
        return -1;
    }

    /**
     * 12 Binary Search  二分查找
     * @param array
     * @param x
     * @param low
     * @param high
     * @return
     */
    public  static int binarySearch(int array[], int x, int low, int high) {

        // Repeat until the pointers low and high meet each other
        while (low <= high) {
            int mid = low + (high - low) / 2;

            if (array[mid] == x)
                return mid;

            if (array[mid] < x)
                low = mid + 1;

            else
                high = mid - 1;
        }

        return -1;
    }
    static int bingo;
    static int nextBingo;

    /**
     *
     * @param vec
     * @param n
     */
    private static void maxMin(int[] vec, int n)
    {
        for (int i = 1; i < n; i++) {
            bingo = Math.min(bingo, vec[i]);
            nextBingo = Math.max(nextBingo, vec[i]);
        }
    }

    /**
     * 13 Bingo Sort宾果排序
     * @param vec
     * @param n
     * @return
     */
    public static int[] bingoSort(int[] vec, int n)
    {
        bingo = vec[0];
        nextBingo = vec[0];
        maxMin(vec, n);
        int largestEle = nextBingo;
        int nextElePos = 0;
        while (bingo < nextBingo) {
            // Will keep the track of the element position
            // to
            // shifted to their correct position
            int startPos = nextElePos;
            for (int i = startPos; i < n; i++) {
                if (vec[i] == bingo) {
                    int temp = vec[i];
                    vec[i] = vec[nextElePos];
                    vec[nextElePos] = temp;
                    nextElePos = nextElePos + 1;
                }
                // Here we are finding the next Bingo
                // Element for the next pass
                else if (vec[i] < nextBingo)
                    nextBingo = vec[i];
            }
            bingo = nextBingo;
            nextBingo = largestEle;
        }
        return vec;
    }



    static int MIN_MERGE = 32;

    /**
     *
     * @param n
     * @return
     */
    private static int minRunLength(int n)
    {
        assert n >= 0;

        // Becomes 1 if any 1 bits are shifted off
        int r = 0;
        while (n >= MIN_MERGE) {
            r |= (n & 1);
            n >>= 1;
        }
        return n + r;
    }

    // This function sorts array from left index to
    // to right index which is of size atmost RUN

    /**
     *
     * @param arr
     * @param left
     * @param right
     */
    private static void insertionSort(int[] arr, int left,int right)
    {
        for (int i = left + 1; i <= right; i++) {
            int temp = arr[i];
            int j = i - 1;
            while (j >= left && arr[j] > temp) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = temp;
        }
    }

    // Merge function merges the sorted runs

    /**
     *
     * @param arr
     * @param l
     * @param m
     * @param r
     */
    public static void timMerge(int[] arr, int l, int m, int r)
    {
        // Original array is broken in two parts
        // left and right array
        int len1 = m - l + 1, len2 = r - m;
        int[] left = new int[len1];
        int[] right = new int[len2];
        for (int x = 0; x < len1; x++) {
            left[x] = arr[l + x];
        }
        for (int x = 0; x < len2; x++) {
            right[x] = arr[m + 1 + x];
        }

        int i = 0;
        int j = 0;
        int k = l;

        // After comparing, we merge those two array
        // in larger sub array
        while (i < len1 && j < len2) {
            if (left[i] <= right[j]) {
                arr[k] = left[i];
                i++;
            }
            else {
                arr[k] = right[j];
                j++;
            }
            k++;
        }

        // Copy remaining elements
        // of left, if any
        while (i < len1) {
            arr[k] = left[i];
            k++;
            i++;
        }

        // Copy remaining element
        // of right, if any
        while (j < len2) {
            arr[k] = right[j];
            k++;
            j++;
        }
    }

    // Iterative Timsort function to sort the
    // array[0...n-1] (similar to merge sort)

    /**
     *  14 Tim Sort
     * @param arr
     * @param n
     */
    public static void timSort(int[] arr, int n)
    {
        int minRun = minRunLength(MIN_MERGE);

        // Sort individual subarrays of size RUN
        for (int i = 0; i < n; i += minRun) {
            insertionSort(
                    arr, i,
                    Math.min((i + MIN_MERGE - 1), (n - 1)));
        }

        // Start merging from size
        // RUN (or 32). It will
        // merge to form size 64,
        // then 128, 256 and so on
        // ....
        for (int size = minRun; size < n; size = 2 * size) {

            // Pick starting point
            // of left sub array. We
            // are going to merge
            // arr[left..left+size-1]
            // and arr[left+size, left+2*size-1]
            // After every merge, we
            // increase left by 2*size
            for (int left = 0; left < n; left += 2 * size) {

                // Find ending point of left sub array
                // mid+1 is starting point of right sub
                // array
                int mid = left + size - 1;
                int right = Math.min((left + 2 * size - 1),
                        (n - 1));

                // Merge sub array arr[left.....mid] &
                // arr[mid+1....right]
                if (mid < right)
                    timMerge(arr, left, mid, right);
            }
        }
    }


    // To find gap between elements
    private static int getNextGap(int gap)
    {
        // Shrink gap by Shrink factor
        gap = (gap*10)/13;
        if (gap < 1)
            return 1;
        return gap;
    }

    // Function to sort arr[] using Comb Sort

    /**
     *15  Comb Sort
     * @param arr
     */
    public static void comSort(int arr[])
    {
        int n = arr.length;

        // initialize gap
        int gap = n;

        // Initialize swapped as true to make sure that
        // loop runs
        boolean swapped = true;

        // Keep running while gap is more than 1 and last
        // iteration caused a swap
        while (gap != 1 || swapped == true)
        {
            // Find next gap
            gap = getNextGap(gap);

            // Initialize swapped as false so that we can
            // check if swap happened or not
            swapped = false;

            // Compare all elements with current gap
            for (int i=0; i<n-gap; i++)
            {
                if (arr[i] > arr[i+gap])
                {
                    // Swap arr[i] and arr[i+gap]
                    int temp = arr[i];
                    arr[i] = arr[i+gap];
                    arr[i+gap] = temp;

                    // Set swapped
                    swapped = true;
                }
            }
        }
    }

    /**
     * 16  Pigeonhole Sort 鸽巢排序
     * @param arr
     * @param n
     */
    public static void pigeonholeSort(int arr[],int n)
    {
        int min = arr[0];
        int max = arr[0];
        int range, i, j, index;
        for(int a=0; a<n; a++)
        {
            if(arr[a] > max)
                max = arr[a];
            if(arr[a] < min)
                min = arr[a];
        }

        range = max - min + 1;
        int[] phole = new int[range];
        Arrays.fill(phole, 0);

        for(i = 0; i<n; i++)
            phole[arr[i] - min]++;


        index = 0;

        for(j = 0; j<range; j++)
            while(phole[j]-->0)
                arr[index++]=j+min;

    }

    // Function sort the array using Cycle sort

    /**
     * 17 Cycle Sort 循环排序
     * @param arr
     * @param n
     */
    public static void cycleSort(int arr[], int n)
    {
        // count number of memory writes
        int writes = 0;

        // traverse array elements and put it to on
        // the right place
        for (int cycle_start = 0; cycle_start <= n - 2; cycle_start++) {
            // initialize item as starting point
            int item = arr[cycle_start];

            // Find position where we put the item. We basically
            // count all smaller elements on right side of item.
            int pos = cycle_start;
            for (int i = cycle_start + 1; i < n; i++)
                if (arr[i] < item)
                    pos++;

            // If item is already in correct position
            if (pos == cycle_start)
                continue;

            // ignore all duplicate elements
            while (item == arr[pos])
                pos += 1;

            // put the item to it's right position
            if (pos != cycle_start) {
                int temp = item;
                item = arr[pos];
                arr[pos] = temp;
                writes++;
            }

            // Rotate rest of the cycle
            while (pos != cycle_start) {
                pos = cycle_start;

                // Find position where we put the element
                for (int i = cycle_start + 1; i < n; i++)
                    if (arr[i] < item)
                        pos += 1;

                // ignore all duplicate elements
                while (item == arr[pos])
                    pos += 1;

                // put the item to it's right position
                if (item != arr[pos]) {
                    int temp = item;
                    item = arr[pos];
                    arr[pos] = temp;
                    writes++;
                }
            }
        }
    }

    /**
     * 18 Cocktail Sort 鸡尾酒排序
     * @param a
     */
    public static void cocktailSort(int a[])
    {
        boolean swapped = true;
        int start = 0;
        int end = a.length;

        while (swapped == true)
        {
            // reset the swapped flag on entering the
            // loop, because it might be true from a
            // previous iteration.
            swapped = false;

            // loop from bottom to top same as
            // the bubble sort
            for (int i = start; i < end - 1; ++i)
            {
                if (a[i] > a[i + 1]) {
                    int temp = a[i];
                    a[i] = a[i + 1];
                    a[i + 1] = temp;
                    swapped = true;
                }
            }

            // if nothing moved, then array is sorted.
            if (swapped == false)
                break;

            // otherwise, reset the swapped flag so that it
            // can be used in the next stage
            swapped = false;

            // move the end point back by one, because
            // item at the end is in its rightful spot
            end = end - 1;

            // from top to bottom, doing the
            // same comparison as in the previous stage
            for (int i = end - 1; i >= start; i--)
            {
                if (a[i] > a[i + 1])
                {
                    int temp = a[i];
                    a[i] = a[i + 1];
                    a[i + 1] = temp;
                    swapped = true;
                }
            }

            // increase the starting point, because
            // the last stage would have moved the next
            // smallest number to its rightful spot.
            start = start + 1;
        }
    }

    // Define a helper function to merge two sorted lists

    /**
     *
     * @param list1
     * @param list2
     * @return
     */
    private static List<Integer> mergeLists(List<Integer> list1, List<Integer> list2) {
        List<Integer> result = new ArrayList<>();
        while (!list1.isEmpty() && !list2.isEmpty()) {
            if (list1.get(0) < list2.get(0)) {
                result.add(list1.remove(0));
            } else {
                result.add(list2.remove(0));
            }
        }
        result.addAll(list1);
        result.addAll(list2);
        return result;
    }

    // Recursive function to perform strand sort

    /**
     *  19 Strand Sort 经典排序
     * @param inputList
     * @return
     */
    public static List<Integer> strandSort(List<Integer> inputList) {
        // Base case: if the input list has 1 or fewer elements, it's already sorted
        if (inputList.size() <= 1) {
            return inputList;
        }

        // Initialize a sublist with the first element of the input list
        List<Integer> sublist = new ArrayList<>();
        sublist.add(inputList.remove(0));

        int i = 0;
        while (i < inputList.size()) {
            // If the current element in the input list is greater than
            // the last element in the sublist,
            // add it to the sublist; otherwise, continue to the next element in the input list.
            if (inputList.get(i) > sublist.get(sublist.size() - 1)) {
                sublist.add(inputList.remove(i));
            } else {
                i++;
            }
        }

        // The sortedSublist contains the sorted elements from the current sublist
        List<Integer> sortedSublist = new ArrayList<>(sublist);

        // Recursively sort the remaining part of the input list
        List<Integer> remainingList = strandSort(inputList);

        // Merge the sorted sublist and the sorted remainingList
        return mergeLists(sortedSublist, remainingList);
    }

    /* The parameter dir indicates the sorting direction,
           ASCENDING or DESCENDING; if (a[i] > a[j]) agrees
           with the direction, then a[i] and a[j] are
           interchanged. */
    private static void compAndSwap(int a[], int i, int j, int dir)
    {
        if ( (a[i] > a[j] && dir == 1) ||
                (a[i] < a[j] && dir == 0))
        {
            // Swapping elements
            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }

    /* It recursively sorts a bitonic sequence in ascending
       order, if dir = 1, and in descending order otherwise
       (means dir=0). The sequence to be sorted starts at
       index position low, the parameter cnt is the number
       of elements to be sorted.*/
    private static void bitonicMerge(int a[], int low, int cnt, int dir)
    {
        if (cnt>1)
        {
            int k = cnt/2;
            for (int i=low; i<low+k; i++)
                compAndSwap(a,i, i+k, dir);
            bitonicMerge(a,low, k, dir);
            bitonicMerge(a,low+k, k, dir);
        }
    }

    /* This function first produces a bitonic sequence by
       recursively sorting its two halves in opposite sorting
       orders, and then  calls bitonicMerge to make them in
       the same order */
    private static void getBitonicSort(int a[], int low, int cnt, int dir)
    {
        if (cnt>1)
        {
            int k = cnt/2;

            // sort in ascending order since dir here is 1
            getBitonicSort(a, low, k, 1);

            // sort in descending order since dir here is 0
            getBitonicSort(a,low+k, k, 0);

            // Will merge whole sequence in ascending order
            // since dir=1.
            bitonicMerge(a, low, cnt, dir);
        }
    }

    /*Caller of bitonicSort for sorting the entire array
      of length N in ASCENDING order */

    /**
     * 20  Bitonic Sort 双调排序
     * @param a
     * @param N
     * @param up
     */
    public static void BitonicSort(int a[], int N, int up)
    {
        getBitonicSort(a, 0, N, up);
    }


    /* Reverses arr[0..i] */

    /**
     *
     * @param arr
     * @param i
     */
     private static void flip(int arr[], int i)
    {
        int temp, start = 0;
        while (start < i)
        {
            temp = arr[start];
            arr[start] = arr[i];
            arr[i] = temp;
            start++;
            i--;
        }
    }

    // Returns index of the
    // maximum element in
    // arr[0..n-1]

    /**
     *
     * @param arr
     * @param n
     * @return
     */
     private static int findMax(int arr[], int n)
    {
        int mi, i;
        for (mi = 0, i = 0; i < n; ++i)
            if (arr[i] > arr[mi])
                mi = i;
        return mi;
    }

    // The main function that
    // sorts given array using
    // flip operations

    /**
     *  21 Pancake Sort 煎饼排序.
     * @param arr
     * @param n
     * @return
     */
    public static int pancakeSort(int arr[], int n)
    {
        // Start from the complete
        // array and one by one
        // reduce current size by one
        for (int curr_size = n; curr_size > 1;
             --curr_size)
        {
            // Find index of the
            // maximum element in
            // arr[0..curr_size-1]
            int mi = findMax(arr, curr_size);

            // Move the maximum element
            // to end of current array
            // if it's not already at
            // the end
            if (mi != curr_size-1)
            {
                // To move at the end,
                // first move maximum
                // number to beginning
                flip(arr, mi);

                // Now move the maximum
                // number to end by
                // reversing current array
                flip(arr, curr_size-1);
            }
        }
        return 0;
    }

    // Sorts array a[0..n-1] using Bogo sort

    /**
     *  22 Bogo Sort  BogoSort or Permutation Sort 置换排序、愚蠢排序、慢排序、猎枪排序或猴子排序
     * @param a
     */
    public static void bogoSort(int[] a)
    {
        // if array is not sorted then shuffle the
        // array again
        while (isSorted(a) == false)
            shuffle(a);
    }

    // To generate permutation of the array

    /**
     *
     * @param a
     */
    private static void shuffle(int[] a)
    {
        // Math.random() returns a double positive
        // value, greater than or equal to 0.0 and
        // less than 1.0.
        for (int i = 1; i < a.length; i++)
            bogoSwap(a, i, (int)(Math.random() * i));
    }

    // Swapping 2 elements

    /**
     *
     * @param a
     * @param i
     * @param j
     */
     private static void bogoSwap(int[] a, int i, int j)
    {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

    // To check if array is sorted or not

    /**
     *
     * @param a
     * @return
     */
     private static boolean isSorted(int[] a)
    {
        for (int i = 1; i < a.length; i++)
            if (a[i] < a[i - 1])
                return false;
        return true;
    }

    /**
     * 23 Gnome Sort 地精排序,也称侏儒排序
     * @param arr
     * @param n
     */
    public static void gnomeSort(int arr[], int n)
    {
        int index = 0;

        while (index < n) {
            if (index == 0)
                index++;
            if (arr[index] >= arr[index - 1])
                index++;
            else {
                int temp = 0;
                temp = arr[index];
                arr[index] = arr[index - 1];
                arr[index - 1] = temp;
                index--;
            }
        }
        return;
    }

    /**
     * 24.Sleep Sort 睡眠排序
     * @param arr
     */
    public static void sleepSort(ArrayList<Integer> arr) {
        ArrayList<Thread> threads = new ArrayList<>();  // Create an ArrayList to hold threads

        for (int num : arr) {
            Thread thread = new Thread(() -> {
                try {
                    Thread.sleep(num);  // Sleep for 'num' milliseconds
                    System.out.print(num + " ");  // Print the number after sleeping
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });

            threads.add(thread); // Add the thread to the ArrayList
            thread.start(); // Start the thread
        }

        for (Thread thread : threads) {
            try {
                thread.join(); // Wait for each thread to finish
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    // Function to implement stooge sort

    /**
     *  25 Stooge Sort 臭皮匠排序
     * @param arr
     * @param l
     * @param h
     */
     public static void stoogeSort(int arr[], int l, int h)
    {
        if (l >= h)
            return;

        // If first element is smaller
        // than last, swap them
        if (arr[l] > arr[h]) {
            int t = arr[l];
            arr[l] = arr[h];
            arr[h] = t;
        }

        // If there are more than 2 elements in
        // the array
        if (h - l + 1 > 2) {
            int t = (h - l + 1) / 3;

            // Recursively sort first 2/3 elements
            stoogeSort(arr, l, h - t);

            // Recursively sort last 2/3 elements
            stoogeSort(arr, l + t, h);

            // Recursively sort first 2/3 elements
            // again to confirm
            stoogeSort(arr, l, h - t);
        }
    }


    // Modifying tag array so that we can access
    // persons in sorted order of salary.

    /**
     * 26 Tag Sort (To get both sorted and original)
     * @param persons
     * @param tag
     */
    public static void tagSort(Person persons[],int tag[])
    {
        int n = persons.length;
        for (int i=0; i<n; i++)
        {
            for (int j=i+1; j<n; j++)
            {
                if (persons[tag[i]].getSalary() >
                        persons[tag[j]].getSalary())
                {
                    // Note we are not sorting the
                    // actual Persons array, but only
                    // the tag array
                    int temp = tag[i];
                    tag[i] = tag[j];
                    tag[j] = temp;
                }
            }
        }
    }


    public static Node root;
    // This method mainly
    // calls insertRec()

    /**
     *
     * @param key
     */
    private static void treeInsert(int key)
    {
        root = insertRec(root, key);
    }

    /* A recursive function to
    insert a new key in BST */

    /**
     *
     * @param root
     * @param key
     * @return
     */
    private static Node insertRec(Node root, int key)
    {

        /* If the tree is empty,
        return a new node */
        if (root == null)
        {
            root = new Node(key);
            return root;
        }

        /* Otherwise, recur
        down the tree */
        if (key < root.key)
            root.left = insertRec(root.left, key);
        else if (key > root.key)
            root.right = insertRec(root.right, key);

        /* return the root */
        return root;
    }

    // A function to do
    // inorder traversal of BST

    /**
     *27 Tree Sort
     * @param root
     */
    public static void inorderRec(Node root)
    {
        if (root != null)
        {
            inorderRec(root.left);
            System.out.print(root.key + " ");
            inorderRec(root.right);
        }
    }

    /**
     *
     * @param arr
     */
    public static void treeins(int arr[])
    {
        for(int i = 0; i < arr.length; i++)
        {
            treeInsert(arr[i]);
        }

    }

    /**
     *  28.Brick Sort / Odd-Even Sort 砖排序算法(Brick Sort),也被称为奇偶排序(Odd-Even Sort)
     * @param arr
     * @param n
     */
    public static void oddEvenSort(int arr[], int n)
    {
        boolean isSorted = false; // Initially array is unsorted

        while (!isSorted)
        {
            isSorted = true;
            int temp =0;

            // Perform Bubble sort on odd indexed element
            for (int i=1; i<=n-2; i=i+2)
            {
                if (arr[i] > arr[i+1])
                {
                    temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                    isSorted = false;
                }
            }

            // Perform Bubble sort on even indexed element
            for (int i=0; i<=n-2; i=i+2)
            {
                if (arr[i] > arr[i+1])
                {
                    temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                    isSorted = false;
                }
            }
        }

        return;
    }


    // Function  for 3-way merge sort process

    /**
     * 29.3-way Merge Sort
     * @param gArray
     */
    public static void mergeSort3Way(Integer[] gArray)
    {
        // if array of size is zero returns null
        if (gArray == null)
            return;

        // creating duplicate of given array
        Integer[] fArray = new Integer[gArray.length];

        // copying elements of given array into
        // duplicate array
        for (int i = 0; i < fArray.length; i++)
            fArray[i] = gArray[i];

        // sort function
        mergeSort3WayRec(fArray, 0, gArray.length, gArray);

        // copy back elements of duplicate array
        // to given array
        for (int i = 0; i < fArray.length; i++)
            gArray[i] = fArray[i];
    }

    /* Performing the merge sort algorithm on the
       given array of values in the rangeof indices
       [low, high).  low is minimum index, high is
       maximum index (exclusive) */

    /**
     *
     * @param gArray
     * @param low
     * @param high
     * @param destArray
     */
    public static void mergeSort3WayRec(Integer[] gArray,int low, int high, Integer[] destArray)
    {
        // If array size is 1 then do nothing
        if (high - low < 2)
            return;

        // Splitting array into 3 parts
        int mid1 = low + ((high - low) / 3);
        int mid2 = low + 2 * ((high - low) / 3) + 1;

        // Sorting 3 arrays recursively
        mergeSort3WayRec(destArray, low, mid1, gArray);
        mergeSort3WayRec(destArray, mid1, mid2, gArray);
        mergeSort3WayRec(destArray, mid2, high, gArray);

        // Merging the sorted arrays
        WayMerge(destArray, low, mid1, mid2, high, gArray);
    }

    /* Merge the sorted ranges [low, mid1), [mid1,
       mid2) and [mid2, high) mid1 is first midpoint
       index in overall range to merge mid2 is second
       midpoint index in overall range to merge*/

    /**
     *
     * @param gArray
     * @param low
     * @param mid1
     * @param mid2
     * @param high
     * @param destArray
     */
    public static void WayMerge(Integer[] gArray, int low,int mid1, int mid2, int high,Integer[] destArray)
    {
        int i = low, j = mid1, k = mid2, l = low;

        // choose smaller of the smallest in the three ranges
        while ((i < mid1) && (j < mid2) && (k < high))
        {
            if (gArray[i].compareTo(gArray[j]) < 0)
            {
                if (gArray[i].compareTo(gArray[k]) < 0)
                    destArray[l++] = gArray[i++];

                else
                    destArray[l++] = gArray[k++];
            }
            else
            {
                if (gArray[j].compareTo(gArray[k]) < 0)
                    destArray[l++] = gArray[j++];
                else
                    destArray[l++] = gArray[k++];
            }
        }

        // case where first and second ranges have
        // remaining values
        while ((i < mid1) && (j < mid2))
        {
            if (gArray[i].compareTo(gArray[j]) < 0)
                destArray[l++] = gArray[i++];
            else
                destArray[l++] = gArray[j++];
        }

        // case where second and third ranges have
        // remaining values
        while ((j < mid2) && (k < high))
        {
            if (gArray[j].compareTo(gArray[k]) < 0)
                destArray[l++] = gArray[j++];

            else
                destArray[l++] = gArray[k++];
        }

        // case where first and third ranges have
        // remaining values
        while ((i < mid1) && (k < high))
        {
            if (gArray[i].compareTo(gArray[k]) < 0)
                destArray[l++] = gArray[i++];
            else
                destArray[l++] = gArray[k++];
        }

        // copy remaining values from the first range
        while (i < mid1)
            destArray[l++] = gArray[i++];

        // copy remaining values from the second range
        while (j < mid2)
            destArray[l++] = gArray[j++];

        // copy remaining values from the third range
        while (k < high)
            destArray[l++] = gArray[k++];
    }


}

  

 

/**
 * encoding: utf-8
 * 版权所有 2023 ©涂聚文有限公司
 * 许可信息查看:
 * 描述:
 * # Author    : geovindu,Geovin Du 涂聚文.
 * # IDE       : IntelliJ IDEA 2023.1 Java 21
 * # Datetime  : 2023 - 2023/9/28 - 10:00
 * # User      : geovindu
 * # Product   : IntelliJ IDEA
 * # Project   : EssentialAlgorithms
 * # File      : SortingExmaple.java
 * # explain   : 学习  Sorting Algorithms 类
 **/

package BLL;

import SortingAlgorithms.SortingAlgorithm;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import Model.Person;
import Model.Node;

public class SortingExmaple {



    /**
     *1.Bubble Sort冒泡排序
     * */
     public static void Bubble()
    {
        int[] geovindu = { -2, 45, 0, 11, -9 };

         // call method using class name
        SortingAlgorithms.SortingAlgorithm.BubbleSort(geovindu);

        System.out.println("1.冒泡排序 Sort Bubble Sorted Array in Ascending Order:");
        System.out.println(Arrays.toString(geovindu));

    }

    /**
     * 2 Selection Sort 选择排序
     */
    public static  void Selection()
    {
        int[] geovindu = { 20, 12, 10, 15, 2 };
        //SelectionSort ss = new SelectionSort();
        SortingAlgorithms.SortingAlgorithm.SelectionSort(geovindu);
        System.out.println("2.选择排序 Selection Sorted Array in Ascending Order: ");
        System.out.println(Arrays.toString(geovindu));

    }

    /**
     * 3. Insertion Sort 插入排序
     * */
    public  static void Insertion()
    {

        int[] geovindu = { 9, 5, 1, 4, 3 };
        SortingAlgorithms.SortingAlgorithm.InsertionSort(geovindu);
        System.out.println("3.插入排序 Insertion Sorted Array in Ascending Order: ");
        System.out.println(Arrays.toString(geovindu));


    }

    /**
     * 4 Merge Sort 合并/归并排序
     */
    public static  void mergeSort()
    {
        int arr[] = { 6, 5, 12, 10, 9, 1 };
        SortingAlgorithms.SortingAlgorithm.mergeSort(arr, 0, arr.length - 1);
        int n = arr.length;
        for (int i = 0; i < n; ++i)
            System.out.print(arr[i] + " ");
        System.out.println();

    }

    /**
     * 5 Quick Sort 快速排序
     */
    public  static void quicksort()
    {

        int[] data = { 8, 7, 2, 1, 0, 9, 6 };
        System.out.println("Unsorted Array");
        System.out.println(Arrays.toString(data));
        int size = data.length;
        // call quicksort() on array data
        SortingAlgorithms.SortingAlgorithm.quickSort(data, 0, size - 1);
        System.out.println("Sorted Array in Ascending Order: ");
        System.out.println(Arrays.toString(data));

    }

    /**
     * 6 Counting Sort 计数排序
     */
    public  static void countSort()
    {

        int[] data = { 4, 2, 2, 8, 3, 3, 1 };
        int size = data.length;
        SortingAlgorithms.SortingAlgorithm.countSort(data, size);
        System.out.println("Sorted Array in Ascending Order: ");
        System.out.println(Arrays.toString(data));
    }

    /**
     * 7 Radix Sort 基数排序
     */
    public static void radixSort()
    {
        int[] data = { 121, 432, 564, 23, 1, 45, 788 };
        int size = data.length;
        SortingAlgorithms.SortingAlgorithm.radixSort(data, size);
        System.out.println("Sorted Array in Ascending Order: ");
        System.out.println(Arrays.toString(data));


    }

    /**
     * 9 Heap Sort 堆排序
     */
    public static void heapifySort()
    {
        int arr[] = { 1, 12, 9, 5, 6, 10 };
        SortingAlgorithms.SortingAlgorithm.heapifySort(arr);
        int n = arr.length;
        for (int i = 0; i < n; ++i)
            System.out.print(arr[i] + " ");
        System.out.println();

    }

    /**
     * 10 Shell Sort 希尔排序
     */
    public static void shellSort()
    {
        int[] data = { 9, 8, 3, 7, 5, 6, 4, 1 };
        int size = data.length;
        SortingAlgorithms.SortingAlgorithm.shellSort(data, size);
        System.out.println("Sorted Array in Ascending Order: ");
        System.out.println(Arrays.toString(data));
    }

    /**
     * 12 Binary Search  二分查找
     */
    public  static  void binarySearch()
    {

        int array[] = { 3, 4, 5, 6, 7, 8, 9 };
        int n = array.length;
        int x = 4;
        int result = SortingAlgorithms.SortingAlgorithm.binarySearch(array, x, 0, n - 1);
        if (result == -1)
            System.out.println("Not found");
        else
            System.out.println("Element found at index " + result);

    }

    /**
     * 13 Bingo Sort宾果排序
     */
    public static  void binggoSor()
    {
        int[] arr = { 5, 4, 8, 5, 4, 8, 5, 4, 4, 4 };
        arr = SortingAlgorithms.SortingAlgorithm.bingoSort(arr, arr.length);
        int n=arr.length;
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    /**
     *14 Tim Sort
     */
   public static void timSort()
   {

       int[] arr = { -2, 7,  15,  -14, 0, 15,  0, 7,
               -7, -4, -13, 5,   8, -14, 12 };
       int n = arr.length;
       System.out.println("Given Array is");
       SortingAlgorithms.SortingAlgorithm.timSort(arr, n);
       System.out.println("After Sorting Array is");
       for (int i = 0; i < n; i++) {
           System.out.print(arr[i] + " ");
       }
       System.out.print("\n");
   }

    /**
     * 15  Comb Sort
     */
   public  static void comSort()
   {
       int arr[] = {8, 4, 1, 56, 3, -44, 23, -6, 28, 0};
       SortingAlgorithms.SortingAlgorithm.comSort(arr);
       System.out.println("sorted array");
       for (int i=0; i<arr.length; ++i)
           System.out.print(arr[i] + " ");
   }

    /**
     * 16  Pigeonhole Sort 鸽巢排序
     */
   public  static  void pigeonholeSort()
   {
       int[] arr = {8, 3, 2, 7, 4, 6, 8};
       System.out.print("Sorted order is : ");
       SortingAlgorithms.SortingAlgorithm.pigeonholeSort(arr,arr.length);
       for(int i=0 ; i<arr.length ; i++)
           System.out.print(arr[i] + " ");


   }

    /**
     * 17 Cycle Sort 循环排序
     */
   public static void cycleSort()
   {
       int arr[] = { 1, 8, 3, 9, 10, 10, 2, 4 };
       int n = arr.length;
       SortingAlgorithms.SortingAlgorithm.cycleSort(arr, n);
       System.out.println("After sort : ");
       for (int i = 0; i < n; i++)
           System.out.print(arr[i] + " ");
   }

    /**
     * 18 Cocktail Sort 鸡尾酒排序
     */
   public static void cocktailSort()
   {
       int[] arr = {5, 2, 9, 3, 7, 6};
       SortingAlgorithms.SortingAlgorithm.cocktailSort(arr);
       System.out.println(Arrays.toString(arr));
   }

    /**
     * 19 Strand Sort 经典排序
     */
   public static void strandSort()
   {
       List<Integer> inputList = new ArrayList<>();
       inputList.add(10);
       inputList.add(5);
       inputList.add(30);
       inputList.add(40);
       inputList.add(2);
       inputList.add(4);
       inputList.add(9);
       List<Integer> outputList = SortingAlgorithms.SortingAlgorithm.strandSort(inputList);
       for (int x : outputList) {
           System.out.print(x + " ");
       }

   }

    /**
     * 20  Bitonic Sort 双调排序
     */
   public static void BitonicSort()
   {
       int arr[] = {3, 7, 4, 8, 6, 2, 1, 5};
       int up = 1;
       SortingAlgorithms.SortingAlgorithm.BitonicSort(arr, arr.length,up);
       System.out.println("\nSorted array");
       int n = arr.length;
       for (int i=0; i<n; ++i)
           System.out.print(arr[i] + " ");
       System.out.println();
   }

    /**
     * 21 Pancake Sort 煎饼排序.
     */
   public static void pancakeSort()
   {
       int arr[] = {23, 10, 20, 11, 12, 6, 7};
       int n = arr.length;
       SortingAlgorithms.SortingAlgorithm.pancakeSort(arr, n);
       System.out.println("Sorted Array: ");
       for (int i = 0; i < n; i++)
           System.out.print(arr[i] + " ");
       System.out.println("");

   }

    /**
     * 22 Bogo Sort  BogoSort or Permutation Sort 置换排序、愚蠢排序、慢排序、猎枪排序或猴子排序
     */
   public static void bogoSort()
   {
       // Enter array to be sorted here
       int[] arr = { 3, 2, 5, 1, 0, 4 };
       SortingAlgorithms.SortingAlgorithm.bogoSort(arr);
       System.out.print("Sorted array: ");
       for (int i = 0; i < arr.length; i++)
           System.out.print(arr[i] + " ");
       System.out.println();
   }

    /**
     * 23 Gnome Sort 地精排序,也称侏儒排序
     */
   public static  void gnomeSort()
   {
       int arr[] = { 34, 2, 10, -9 };
       SortingAlgorithms.SortingAlgorithm.gnomeSort(arr, arr.length);
       System.out.print("Sorted sequence after applying Gnome sort: ");
       System.out.println(Arrays.toString(arr));
   }

    /**
     * 24.Sleep Sort 睡眠排序
     */
    public static void sleepSort()
    {
        ArrayList<Integer> arr = new ArrayList<>();
        arr.add(34);   // Add elements to the ArrayList
        arr.add(23);
        arr.add(122);
        arr.add(9);
        SortingAlgorithms.SortingAlgorithm.sleepSort(arr); // Call the sleepSort function to sort the ArrayList
    }

    /**
     *  25 Stooge Sort 臭皮匠排序
     */
    public static void stoogeSort()
    {
        int arr[] = { 2, 4, 5, 3, 1 };
        int n = arr.length;

        SortingAlgorithms.SortingAlgorithm.stoogeSort(arr, 0, n - 1);

        for (int i = 0; i < n; i++)
            System.out.print(arr[i] + " ");
    }

    /**
     * 26 Tag Sort
     */
    public static void tagSort()
    {
        // Creating objects and their original
        // order (in tag array)
        int n = 5;
        Person persons[] = new Person[n];
        persons[0] = new Person(0, 233.5f);
        persons[1] = new Person(1, 23f);
        persons[2] = new Person(2, 13.98f);
        persons[3] = new Person(3, 143.2f);
        persons[4] = new Person(4, 3f);
        int tag[] = new int[n];
        for (int i = 0; i < n; i++)
            tag[i] = i;

        // Every Person object is tagged to
        // an element in the tag array.
        System.out.println("Given Person and Tag ");
        for (int i = 0; i < n; i++)
            System.out.println(persons[i] +
                    " : Tag: " + tag[i]);

        // Modifying tag array so that we can access
        // persons in sorted order.
        SortingAlgorithms.SortingAlgorithm.tagSort(persons, tag);

        System.out.println("New Tag Array after "+
                "getting sorted as per Person[] ");
        for (int i=0; i<n; i++)
            System.out.println(tag[i]);

        // Accessing persons in sorted (by salary)
        // way using modified tag array.
        for (int i = 0; i < n; i++)
            System.out.println(persons[tag[i]]);

    }

    /**
     * 27 Tree Sort
     */
    public static void TreeSort()
    {

       // Node root;
        int arr[] = {5, 4, 7, 2, 11};
        SortingAlgorithms.SortingAlgorithm.treeins(arr);
        SortingAlgorithms.SortingAlgorithm.inorderRec(SortingAlgorithms.SortingAlgorithm.root);
    }

    /**
     * 28.Brick Sort / Odd-Even Sort 砖排序算法(Brick Sort),也被称为奇偶排序(Odd-Even Sort)
     */
    public static void BrickSort()
    {
        int arr[] = {34, 2, 10, -9};
        int n = arr.length;
        SortingAlgorithms.SortingAlgorithm.oddEvenSort(arr, n);
        for (int i=0; i < n; i++)
            System.out.print(arr[i] + " ");
        System.out.println(" ");

    }

    /**
     * 29.3-way Merge Sort
     */
    public static void mergeSort3Way()
    {
        // test case of values
        Integer[] data = new Integer[] {45, -2, -45, 78,
                30, -42, 10, 19, 73, 93};
        SortingAlgorithms.SortingAlgorithm.mergeSort3Way(data);
        System.out.println("After 3 way merge sort: ");
        for (int i = 0; i < data.length; i++)
            System.out.print(data[i] + " ");



    }

}

  

 

 

 

 

调用:

/**
 * encoding: utf-8
 * 版权所有 2023 ©涂聚文有限公司
 * 许可信息查看:
 * 描述:
 * # Author    : geovindu,Geovin Du 涂聚文. *
 * # IDE      : IntelliJ IDEA 2023.1 Java 21
 *
 * # Datetime  : 2023 - 2023/9/28 - 9:55
 * # User      : geovindu
 * # Product   : IntelliJ IDEA
 * # Project   : EssentialAlgorithms
 * # File      : Main.java
 * # explain   : 学习 Sorting Algorithms 类
 **/

import BLL.SortingExmaple;


public class Main {

    /**
     *
     * */
    public static void main(String[] args)
    {
        System.out.println("Hello world! Java, 涂聚文 geovindu Geovin Du 学习Java");

        // 1.Bubble Sort冒泡排序法
        SortingExmaple.Bubble();
        //2.
        SortingExmaple.Selection();
        //3.
        SortingExmaple.Insertion();


    }
}

  

 

posted @ 2023-09-28 14:56  ®Geovin Du Dream Park™  阅读(26)  评论(0)    收藏  举报