java实现 归并排序,选择排序,插入排序

归并排序 转https://www.cnblogs.com/chengxiao/p/6194356.html

package com.anim.myapplication;

public class SortTest {
    private static int[] arr = {34, 45, 2, 35, 34, 52, 23, 4, 3, 8};
    private static int len;

    public static void main(String[] args) {
        len = arr.length;
        System.out.println("排序前:");
        printList(len);

//        selectSort();
//        insertSort();
//        mergeSort();//这个是从整体一步步拆分的思路,
        mergeSortDown2Up();//这种思路是先分组在合并
        System.out.println("排序后 ");
        printList(len);
    }

    private static void printList(int len) {
        for (int i = 0; i < len; i++) {
            System.out.print(" " + arr[i]);
        }
        System.out.println();
    }

 //选择排序 一次选择一个最小值,记录最小值的位置,交换最小值和当前第一个的位置
    private static void selectSort() {
        int minIndex = 0;
        int temp = 0;
        for (int i = 0; i < len; i++) {
            minIndex = i;
            for (int j = i + 1; j < len; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;

        }

    }
//插入排序 两种循环都可以
    private static void insertSort() {
        int temp;
//        for (int i = 1; i < len; i++) {
//            for (int j = 0; j < i; j++) {
//                if (arr[j] > arr[i]) {
//                    temp = arr[j];
//                    arr[j] = arr[i];
//                    arr[i] = temp;
//                }
//            }
//        }

        for (int i = 0; i < len; i++) {
            for (int j = i; j > 0; j--) {
                if (arr[j] < arr[j - 1]) {
                    temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                }
            }
        }
    }

    public static void mergeSort() {
        int temp[] = new int[arr.length];
        mergeSort(0, len - 1, temp);

    }

    public static void mergeSort(int left, int right, int[] temp) {
        if (left < right) {
            int mid = (left + right) / 2;
            mergeSort(left, mid, temp);
            mergeSort(mid + 1, right, temp);
            merge(left, mid, right, temp);
        }
    }

    public static void merge(int left, int mid, int right, int[] temp) {
        int i = left;
        int j = mid + 1;
        int k = 0;
        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) {
                temp[k++] = arr[i++];
            } else {
                temp[k++] = arr[j++];
            }
        }
        while (i <= mid) {
            temp[k++] = arr[i++];
        }
        while (j <= right) {
            temp[k++] = arr[j++];
        }
        k = 0;
        while (left <= right) {
            arr[left++] = temp[k++];
        }

    }

    public static void mergeSortDown2Up() {
        int[] temp = new int[arr.length];
        for (int d = 1; d < len; d = d * 2) {
            mergeGroups(d, temp);
        }
    }

    public static void mergeGroups(int groupLen, int[] temp) {
        int i;
        int twolen = 2 * groupLen;
        for (i = 0; i + twolen - 1 < len; i = i + twolen) {
            System.out.println("mergeGroups for i = " + i + " grouplen = " + groupLen);
            merge(i, i + groupLen - 1, i + twolen - 1, temp);
        }
        System.out.println("mergeGroups i = " + i);
        if (i + groupLen - 1 < len - 1) {
            merge(i, i + groupLen - 1, len - 1, temp);
        }
    }
  
}
发布了5 篇原创文章 · 获赞 2 · 访问量 2737

猜你喜欢

转载自blog.csdn.net/u010502370/article/details/85235869