基本排序算法的总结

# 插入排序

    public static int[] insertSort2(int[] arr) {
        if (arr.length < 2 || arr == null) {
            return arr;
        }
        // 假设刚开始数组中只存在一个数,从第二个数开始插入
        for (int i = 1; i < arr.length; i++) {
            // 记录当前插入的数的值
            int current = arr[i];
            // 从当前数的前一位进行比较,一直比较到 arr[0]
            for (int j = i - 1; j >= 0; j--) {
                // 如果插入数小于比较数,比较数向后移动一位(index+1),插入数占据比较数的位置
                if (arr[j] > arr[j + 1]) {
                    arr[j + 1] = arr[j];
                    arr[j] = current;
                }
            }
        }
        return arr;
    }

 # 选择排序

 

    public static void selectSort(int[] arr) {
        if (arr.length == 1 || arr == null) {
            return;
        }

        for (int i = 0; i < arr.length; i++) {
            // 假设当前的数是最小数
            int minIndex = i;
            // 向后遍历,找到最小的数
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[minIndex]) {
                    // 如果遇到更小的数,让minIndex=它的index
                    minIndex = j;
                }
            }
            // 当前数和最小数换位置
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }

 # 归并排序

    public static void mergeSortRecur(int[] arr, int left, int right) {
        if (left == right) {
            return;
        }
        int mid = (left + right) / 2;
        mergeSortRecur(arr, left, mid);
        mergeSortRecur(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }    

    public static void mergeSortIter(int[] arr, int len) {
        int left, mid, right;
        for (int i = 1; i < len; i *= 2) {
            left = 0;
            while (left + i < len) {
                mid = left + i - 1;
                right = mid + i < len ? mid + i : len - 1;
                merge(arr, left, mid, right);
                left = right + 1;
            }
        }
    }

    private static void merge(int[] arr, int left, int mid, int right) {
        int[] tmp = new int[right - left + 1];
        int i = left;
        int j = mid + 1;
        int index = 0;
        while (i <= mid && j <= right) {
            if (arr[i] < arr[j]) {
                tmp[index++] = arr[i++];
            } else {
                tmp[index++] = arr[j++];
            }
        }
        while (i <= mid) {
            tmp[index++] = arr[i++];
        }
        while (j <= right) {
            tmp[index++] = arr[j++];
        }
        for (int k = 0; k < tmp.length; k++) {
            arr[left++] = tmp[k];
        }
    }

 

posted on 2018-10-18 18:20  斜月三星一太阳  阅读(169)  评论(0编辑  收藏  举报