• java 实现七大基本排序算法


    一、 选择排序

        /**
         * 选择排序: int arr[] = { 5, 6, 2, 7, 8, 6, 4 };
         * 
         *  第0趟
            5 2 6 7 6 4 8 
            第1趟
            2 5 6 6 4 7 8 
            第2趟
            2 5 6 4 6 7 8 
            第3趟
            2 5 4 6 6 7 8 
            第4趟
            2 4 5 6 6 7 8 
            第5趟
            2 4 5 6 6 7 8 
            第6趟
            2 4 5 6 6 7 8
         */
        public void selectSorted(int arr[]) {
    
            int n = arr.length;
            for (int i = 0; i < n; i++) {
    
                for (int j = 0; j < n - 1; j++) {
    
                    if (arr[j + 1] < arr[j])
                        swap(arr, j, j + 1);
                }
                System.out.println("
    " + "第" + i + "趟");
                printArray(arr);
            }
        }
    View Code

    二、插入排序

        /**
         * 插入排序 : int arr[] = { 5, 6, 2, 7, 8, 6, 4 };
         *  第1趟
            5 6 2 7 8 6 4 
            第2趟
            2 5 6 7 8 6 4 
            第3趟
            2 5 6 7 8 6 4 
            第4趟
            2 5 6 7 8 6 4 
            第5趟
            2 5 6 6 7 8 4 
            第6趟
            2 4 5 6 6 7 8 
         */
        public void insertSorted(int arr[]) {
    
            int n = arr.length;
    
            for (int i = 1; i < n; i++) {
    
                for (int j = i; j > 0; j--) {
                    
                    if (arr[j] < arr[j - 1])
                        swap (arr,j, j - 1);
                }
                System.out.println("
    " + "第" + i + "趟");
                printArray(arr);
            }
    
        }
    
        // 效率更优,减少不必要的交换
        public void insertSorted2(int arr[]) {
    
            int n = arr.length;
    
            for (int i = 1; i < n; i++) {
    
                int ele = arr[i];  // 当前待比较的元素
                int j;               // 当前元素最终的下标位置
                for (j = i; j > 0 && arr[j - 1] > ele; j--)
                    arr[j] = arr[j - 1];
                arr[j] = ele;
                
                System.out.println("
    " + "第" + i + "趟");
                printArray(arr);
            }
        }
    View Code

    三、冒泡排序

        /**
         * 冒泡排序 : int arr[] = { 5, 6, 2, 7, 8, 6, 4 };
         * 
         *     第0趟
            5 2 6 7 6 4 8 
            第1趟
            2 5 6 6 4 7 8 
            第2趟
            2 5 6 4 6 7 8 
            第3趟
            2 5 4 6 6 7 8 
            第4趟
            2 4 5 6 6 7 8 
            第5趟
            2 4 5 6 6 7 8 
            第6趟
            2 4 5 6 6 7 8
         */
        public void bubbleSorted(int arr[]) {
    
            int n = arr.length;
    
            for (int i = 0; i < n; i++) {
    
                for (int j = 0; j < n - i - 1; j++)
                    if ( arr[j] > arr[j + 1])
                        swap(arr, j, j + 1);
                
                System.out.println("
    " + "第" + i + "趟");
                printArray(arr);
                
            }
        }
    View Code

    四、归并排序

        /**
         * 归并排序 :
            4 5 2 7 1 6 3 
            4 5 2 7 1 6 3 
            2 4 5 7 1 6 3 
            2 4 5 7 1 6 3 
            2 4 5 7 1 3 6 
            1 2 3 4 5 6 7 
         */
        public void mergeSorted(int arr[]) {
    
            int n = arr.length - 1; // 闭区间
            splitArray(arr, 0, n);
    
        }
    
        private void splitArray(int[] arr, int L, int R) {
    
            if (L >= R) {
                return;
            }
    
            int mid = L + (R - L) / 2;
    
            splitArray(arr, L, mid);
            splitArray(arr, mid + 1, R);
    
            // merge(arr, L, mid, R);
    
            // 优化
            if (arr[mid] > arr[mid + 1])
                merge(arr, L, mid, R);
    
            printArray(arr);
            System.out.println();
    
        }
    
        private void merge(int[] arr, int L, int mid, int R) {
    
            int aux[] = new int[R - L + 1];
    
            for (int i = L; i <= R; i++) {
    
                aux[i - L] = arr[i];
            }
    
            int i = L;
            int j = mid + 1;
    
            for (int k = L; k <= R; k++) {
    
                if (i > mid) {
                    arr[k] = aux[j - L];
                    j++;
                } else if (j > R) {
                    arr[k] = aux[i - L];
                    i++;
                } else if (aux[i - L] < aux[j - L]) {
                    arr[k] = aux[i - L];
                    i++;
                } else if (aux[i - L] > aux[j - L]) {
                    arr[k] = aux[j - L];
                    j++;
                } else { // 相等情况,
                    arr[k] = aux[j - L];
                    j++;
                }
    
            }
        }
    View Code

     五、快速排序

        /**
         * 快速排序
         */
        public void quickSorted(int arr[]) {
    
            int n = arr.length - 1;
    
            quickSorted(arr, 0, n);
        }
    
        private void quickSorted(int[] arr, int L, int R) {
    
            if (L >= R)
                return;
    
            // 单路
    //        int p1 = partioner(arr, L, R);
    //        
    //        quickSorted(arr, L, p1 - 1);
    //        quickSorted(arr, p1 + 1, R);
    
            // 双路
            int p2 = partioner2(arr, L, R);
    
            quickSorted(arr, L, p2 - 1);
            quickSorted(arr, p2 + 1, R);
        }
    
        // 单路
        private int partioner(int[] arr, int L, int R) {
    
            int v = arr[L];
            int j = L;
    
            for (int i = j + 1; i <= R; i++) {
    
                if (arr[i] < v) {
                    swap(arr, i, j + 1);
                    j++;
    
                }
            }
            swap(arr, j, L);
    
            return j;
        }
    
        // 双路
        private int partioner2(int[] arr, int L, int R) {
    
            int v = arr[L];
    
            int j = L + 1;
            int k = R;
    
            while (true) {
    
                while (j <= R && arr[j] < v)
                    j++;
                while (k >= L + 1 && arr[k] > v)
                    k--;
                if (k < j)
                    break;
    
                swap(arr, j, k);
    
            }
    
            swap(arr, L, k);
    
            return k;
        }
    
        // 三路
        public void quickSorted3(int arr[]) {
    
            int n = arr.length - 1;
    
            quickSorted3(arr, 0, n);
        }
    
        private void quickSorted3(int[] arr, int L, int R) {
    
            if (L >= R)
                return;
    
            int v = arr[L];
    
            int lt = L;
            int gt = R + 1;
            int i = lt + 1;
    
            while (i < gt) {
    
                if (arr[i] < v) {
                    swap(arr, lt + 1, i);
                    i++;
                    lt++;
                } else if (arr[i] > v) {
                    swap(arr, i, gt - 1);
                    gt--;
                } else
                    i++;
            }
            swap(arr, lt, L);
    
            quickSorted3(arr, L, lt - 1);
            quickSorted3(arr, gt, R);
        }
    View Code

    六、堆排序

        /**
         * 堆排序
         */
        public void heapSorted(int arr[]) {
    
            int n = arr.length;
    
            int pos = (n - 1) / 2;
            for (int i = pos; i >= 0; i--) {
                shiftDown(arr, i, n);
            }
    
            for (int i = n - 1; i > 0; i--) {
    
                swap(arr, 0, i);
                shiftDown(arr, 0, i);
            }
    
        }
    
        private void shiftDown(int arr[], int pos, int n) {
    
            while (pos * 2 + 1 < n) {
    
                int k = (pos * 2) + 1;
                if (k + 1 < n && arr[k + 1] > arr[k])
                    k = k + 1;
                if (arr[pos] < arr[k]) {
                    swap(arr, k, pos);
                    pos = k;
                } else
                    break;
            }
        }
    View Code

    七、希尔排序

        /**
         * 希尔排序
         */
        public void shellSortd(int arr[]) {
    
            int n = arr.length;
    
            int i, j, h;
            int tmp;
    
            for (h = n / 2; h > 0; h = h / 2) {
                for (i = h; i < n; i++) {
                    tmp = arr[i];
                    for (j = i - h; j >= 0; j = j - h) {
                        if (tmp < arr[j])
                            arr[j + h] = arr[j];
                        else
                            break;
                    }
                    arr[j + h] = tmp;
    
                }
            }
        }
    View Code
  • 相关阅读:
    luogu1196 银河英雄传说 (并查集)
    [BZOJ2243][SDOI2011]染色
    [BZOJ1879] [Sdoi2009]Bill的挑战
    [Noip2003] 侦探推理
    [Noip2005] 篝火晚会
    [JZOJ100047] 【NOIP2017提高A组模拟7.14】基因变异
    [九省联考2018]一双木棋chess
    [Noip2009] 靶形数独
    [Luogu2737] [USACO4.1]麦香牛块Beef McNuggets
    [BZOJ3109] [cqoi2013]新数独
  • 原文地址:https://www.cnblogs.com/ytuan996/p/10689112.html
Copyright © 2020-2023  润新知