七个基本排序算法 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("\n" + "第" + 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("\n" + "第" + 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("\n" + "第" + 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("\n" + "第" + 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

猜你喜欢

转载自www.cnblogs.com/ytuan996/p/10689112.html