CodeZLei

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::
package com.zl;

import java.io.IOException;
import java.util.Arrays;

public class Test {
    public static void main(String[] args) throws IOException {
        int arr[] = {3, 4, 2, 1, 6, 5, 7, 8, 0, 10, 9};
        System.out.println("选择排序: " + Arrays.toString(sortBySelect(arr)));
        System.out.println("插入排序: " + Arrays.toString(sortByInsert(arr)));
        System.out.println("希尔排序: " + Arrays.toString(sortbyXiEr(arr)));
        System.out.println("快速排序: " + Arrays.toString(sortByQuick(arr, 0, arr.length - 1)));
        System.out.println("自顶向下的归并排序: " + Arrays.toString(mergeSortForTop(arr, 0, arr.length - 1)));
        System.out.println("自底向上的归并排序: " + Arrays.toString(mergeSortForBottom(arr, 0, arr.length - 1)));

    }

    // 快速排序
    public static int[] sortByQuick(int[] arr, int start, int end) {
        if (start == end) {
            return arr;
        }

        int boundaryLocal = binarySeparateArr(arr, start, end);

        // 处理左边数组
        sortByQuick(arr, start, Math.max(boundaryLocal - 1, start));
        // 处理右边数组
        sortByQuick(arr, Math.min(boundaryLocal + 1, end), end);


        return arr;
    }

    // 自底向上的归并排序
    public static int[] mergeSortForBottom(int[] arr, int start, int end) {
        for (int i = 1; i < arr.length; i += i) {
            for (int j = 0; j < arr.length - i; j += 2 * i) {
                mergeArrWithSort(arr, j, j + i - 1, Math.min(arr.length - 1, j + 2 * i - 1));
            }
        }
        return arr;
    }


    // 自顶向下的归并排序
    public static int[] mergeSortForTop(int[] arr, int start, int end) {
        if (start == end) {
            return arr;
        }
        int mid = (start + end) / 2;
        // 左边排序
        mergeSortForTop(arr, start, mid);
        // 右边排序
        mergeSortForTop(arr, mid + 1, end);
        // 合并
        return mergeArrWithSort(arr, start, mid, end);
    }

    // 希尔排序
    public static int[] sortbyXiEr(int arr[]) {
        int h = 1;
        while (h < arr.length / 3) h = 3 * h + 1;
        while (h >= 1) {
            for (int i = h; i < arr.length; i++) {
                for (int j = i; j >= h; j = j - h) {
                    if (checkLeftSmall(arr[j], arr[j - h])) {
                        exchange(arr, j, j - h);
                    }
                }
            }
            h = h / 3;
        }
        return arr;
    }


    // 插入排序
    public static int[] sortByInsert(int arr[]) {
        for (int i = 1; i < arr.length; i++) {
            for (int j = i - 1; j >= 0; j--) {
                if (!checkLeftSmall(arr[j], arr[j + 1])) {
                    exchange(arr, j, j + 1);
                }
            }
        }
        return arr;

    }


    // 选择排序
    public static int[] sortBySelect(int arr[]) {
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (!checkLeftSmall(arr[min], arr[j])) {
                    min = j;
                }
            }
            if (min != i) {
                exchange(arr, min, i);
            }
        }
        return arr;

    }

    // 两个数组 归并
    public static int[] mergeArrWithSort(int[] arr, int left, int mid, int right) {
        int temp[] = new int[arr.length];
        System.arraycopy(arr, 0, temp, 0, arr.length);
        int le = left;
        int ri = mid + 1;
        for (int i = left; i <= right; i++) {
            if (le == mid + 1) {
                arr[i] = temp[ri++];
            } else if (ri == right + 1) {
                arr[i] = temp[le++];
            } else if (checkLeftSmall(temp[le], temp[ri])) {
                arr[i] = temp[le++];
            } else {
                arr[i] = temp[ri++];
            }
        }
        return arr;
    }

    // 二分数组
    public static int binarySeparateArr(int arr[], int start, int end) {
        int boundary = arr[start];
        int left = start + 1;
        int right = end;
        while (true) {
            while (left < right && arr[left] <= boundary) {
                left++;
            }
            while (right > left && arr[right] > boundary) {
                right--;
            }
            if (left == right) {
                break;
            } else {
                exchange(arr, left, right);
            }
        }
        exchange(arr, start, left - 1);
        return left - 1;


    }

    // 数据交换
    public static void exchange(int arr[], int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    // 验证大小
    public static boolean checkLeftSmall(int left, int right) {
        return left <= right;
    }

}

 

posted on 2020-03-19 23:42  CodeZLei  阅读(165)  评论(0编辑  收藏  举报