常见的七种排序算法解析

感情迁移 提交于 2019-12-04 21:31:45

 

选择排序

实现原理

首先从未排序序列中找到最小的元素,放置到排序序列的起始位置,然后从剩余的未排序序列中继续寻找最小元素,放置到已排序序列的末尾。所以称之为选择排序。

代码实现

    public static int[] selectionSort(int[] arr){
        if (null == arr || arr.length == 0){
            return null;
        }

        int length = arr.length;
        for (int i = 0; i < length - 1; i++) {
            int min = i;
            for (int j = i + 1; j < length; j++) {
                if (arr[j] < arr[min]){
                    min = j;
                }
            }
            int temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
        return arr;
    }

案例分析

enter image description here

时间复杂度与空间复杂度

每次要找一遍最小值,最坏情况下找n次,这样的过程要执行n次,所以时间复杂度还是O(n^2)。空间复杂度是O(1)。

快速排序

实现原理

  • 在数据集之中,选择一个元素作为”基准”(pivot)。

  • 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition)。

    操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。

  • 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

代码实现

        public static int partition(int[] array, int lo, int hi) {
            // 固定的切分方式
            int key = array[lo];
            while (lo < hi) {
                while (array[hi] >= key && hi > lo) {// 从后半部分向前扫描
                        hi--;
                }
                array[lo] = array[hi];
                while (array[lo] <= key && hi > lo) {// 从前半部分向后扫描
                    lo++;
                }
                array[hi] = array[lo];
            }
            array[hi] = key;
            return hi;
        }

        public static int[] sort(int[] array, int lo, int hi) {
            if (lo >= hi) {
                return array;
            }
            int index = partition(array, lo, hi);
            sort(array, lo, index - 1);
            sort(array, index + 1, hi);
            return array;
        }

案例分析

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!