美文网首页
Java常见的排序算法

Java常见的排序算法

作者: 彳亍口巴 | 来源:发表于2020-05-30 14:07 被阅读0次

几种常见排序算法的时间复杂度


由此可见,在最好情况下,插入排序和冒泡排序最快,在平均情况下,快速排序最快,最坏情况下堆排序和归并排序最快。

稳定性比较

  • 稳定性算法包括:插入排序,冒泡排序,归并排序;

  • 非稳定性算法包括:堆排序,快速排序,简单选择排序;


main方法:

public static void main(String[] args) {
        int[] array = new int[] { 2, 4, 3, 6, 5, 8, 1 };
        // bubbleSort(array); // 调用冒泡排序算法
        // selectSort(array); // 调用选择排序算法
        // insertSort(array); // 调用插入排序算法
        // int[] mergeSort = mergeSort(array); // 调用归并排序算法
        quickSort(array, 0, array.length - 1);
        for (int n : array) {
            System.out.println(n);
        }
    }

冒泡排序:

/**
     * 冒泡排序,把大的元素向后移
     */
    public static void bubbleSort(int[] array) {
        if (array.length == 0)
            return;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j + 1] < array[j]) {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }

选择排序:

/**
     * 选择排序算法:每次都找到未排序的最小的数,将其调换到前面
     */
    public static void selectSort(int[] array) {
        if (array.length == 0)
            return;
        for (int i = 0; i < array.length; i++) {
            int minIndex = i;
            // 开始找最小值,保存其下标到minIndex中
            for (int j = i; j < array.length; j++) {
                if (array[minIndex] < array[j]) // 这样是从大到小
                    minIndex = j;
            }
            // 找完就开始交换
            int temp = array[i];
            array[i] = array[minIndex];
            array[minIndex] = temp;
        }
    }

插入排序:

/**
     * 插入排序:把一个数拿出来,和前一个数比较,如果小于前一个数,继续移动,直到找到大于数组中的数,插在那个数后面
     */
    public static void insertSort(int[] arr) {
        if (arr.length == 0)
            return;
        for (int i = 0; i < arr.length - 1; i++) {
            int current = arr[i + 1]; // 把这个数拿出来
            int preIndex = i; // 前一个数的下标
            // 如果当前数一直比前一个数小,将前一个数向右移动
            while (preIndex >= 0 && current < arr[preIndex]) {
                arr[preIndex + 1] = arr[preIndex];
                preIndex--;
            }
            // 找到比自己小的数,插入当前位置
            arr[preIndex + 1] = current;
        }
    }

归并排序:

/**
     * 归并排序:利用递归将数组分为多段进行排序
     */
    public static int[] mergeSort(int[] arr) {
        if (arr.length < 2)
            return arr;
        int mid = arr.length / 2;
        int[] left = Arrays.copyOfRange(arr, 0, mid);
        int[] right = Arrays.copyOfRange(arr, mid, arr.length);
        int[] merge = merge(mergeSort(left), mergeSort(right));
        return merge;
    }

    /**
     * 将两个数组进行合并
     */
    public static int[] merge(int[] left, int[] right) {
        int[] result = new int[left.length + right.length];
        for (int index = 0, i = 0, j = 0; index < result.length; index++) {
            if (i >= left.length)
                result[index] = right[j++]; // 左边已经遍历完了,右边的直接放进数组中
            else if (j >= right.length)
                result[index] = left[i++];
            else if (left[i] > right[j])
                result[index] = right[j++];
            else
                result[index] = left[i++];
        }

        return result;
    }

快速排序:

/**
     * 快速排序算法实现
     */
    public static void quickSort(int[] arr, int left, int right) {
        if (left > right)
            return;
        int base = arr[left];
        int i = left, j = right;
        // 从右往左找,找比base小的数,找到就停止
        while (i < j) {
            while (arr[j] >= base && i < j) {
                j--;
            }
            // 从左往右找,找到比base大的数,找到就停止
            while (arr[i] <= base && i < j) {
                i++;
            }
            // 两个都找到了,交换两个位置
            if (i < j) {

                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;

                // swap(arr, i, j);
            }
        }
        // 最后将base的位置和i的位置互换
        arr[left] = arr[j];
        arr[j] = base;
        // swap(arr, left, j);
        // 递归,继续向基准的左右两边执行和上面同样的操作
        // i的索引处为上面已确定好的基准值的位置,无需再处理
        quickSort(arr, j + 1, right);
        quickSort(arr, left, j - 1);

    }

相关文章

  • 排序算法(四) 希尔排序(插入排序的进化)

    参考Java排序算法(四):希尔排序常见排序算法 - 希尔排序 (Shell Sort) 希尔排序算法是按其设计者...

  • 排序算法

    常见排序算法比较 参考资料:各种排序算法比较 参考资料:快速排序算法 必须知道的八大种排序算法【java实现】(一...

  • 数据结构&算法(一)

    一、Java实现快速排序算法 二、Java实现折半插入排序算法 三、Java实现冒泡排序算法

  • 7大经典的排序算法总结实现

    作者 : 专注J2EE来源 : 博客园 常见排序算法总结与实现 本文使用Java实现这几种排序。以下是对排序算法总...

  • 7 天时间,我整理并实现了这 9 种最经典的排序算法

    回顾 我们前面已经介绍了 3 种最常见的排序算法: java 实现冒泡排序讲解 QuickSort 快速排序到底快...

  • 常见排序算法总结 -- java实现

    常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次...

  • 盘点常用Java排序算法

    本文主要介绍Java的七种常见排序算法的实现,对选择排序、插入排序、冒泡排序、归并排序、快速排序、希尔排序、最小堆...

  • 盘点常用Java排序算法

    本文主要介绍Java的七种常见排序算法的实现,对选择排序、插入排序、冒泡排序、归并排序、快速排序、希尔排序、最小堆...

  • 排序算法

    常见排序算法及JAVA实现 简单选择排序(SelectSort) 选择排序思想很简单,对所有元素进行遍历,选出最小...

  • LeetCode大全

    1.常见排序算法: 常见的排序算法:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、...

网友评论

      本文标题:Java常见的排序算法

      本文链接:https://www.haomeiwen.com/subject/ftnczhtx.html