排序算法-插入排序和归并排序

简介: 排序算法-插入排序和归并排序

1、插入排序


(1)插入排序的介绍


插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。


是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。



(2)插入排序的原理


  1. 从第一个元素开始,该元素可以认为已经被排序;


  1. 取出下一个元素,在已经排序的元素序列中从后向前扫描;


  1. 如果该元素(已排序)大于新元素,将该元素移到下一位置;


  1. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;


  1. 将新元素插入到该位置后;


  1. 重复步骤2~5。


(3)动态图演示


image.png


(4)代码演示


public static void insertionSort(int[] array) {
        int current;
        for (int i = 0; i < array.length - 1; i++) {
            current = array[i + 1];
            int preIndex = i;
            while (preIndex >= 0 && current < array[preIndex]) {
                array[preIndex + 1] = array[preIndex];
                preIndex--;
            }
            array[preIndex + 1] = current;
        }
    }
复制代码




2、归并排序


(1)归并排序的介绍


归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。


(2)归并排序的原理


  1. 将每对单个元素(默认情况下,已排序)归并为2个元素的有序数组,


  1. 将2个元素的每对有序数组归并成4个元素的有序数组,重复这个过程......,


  1. 最后一步:归并2个N / 2元素的排序数组(为了简化讨论,我们假设N是偶数)以获得完全排序的N个元素数组。



(3)动态图演示


image.png


(4)代码演示


public static int[] MergeSort(int[] array) {
        if (array.length < 2)return array;
        int mid = array.length / 2;
        int[] left = Arrays.copyOfRange(array, 0, mid);
        int[] right = Arrays.copyOfRange(array, mid, array.length);
        return merge(MergeSort(left), MergeSort(right));
    }
    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;
    }



相关文章
|
19天前
|
算法 前端开发 搜索推荐
前端算法之归并排序
前端算法之归并排序
14 0
|
4天前
|
存储 搜索推荐 算法
归并排序算法深入解析
归并排序算法深入解析
|
10天前
|
人工智能 算法 C++
c++算法学习笔记 (2)归并排序
c++算法学习笔记 (2)归并排序
|
13天前
|
算法 搜索推荐
【算法基础】基础算法(一)--(快速排序、归并排序、二分)
【算法基础】基础算法(一)--(快速排序、归并排序、二分)
|
19天前
|
算法 前端开发 搜索推荐
前端算法之插入排序
前端算法之插入排序
14 0
|
19天前
|
搜索推荐 C语言
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
12 0
|
19天前
|
搜索推荐 算法 Java
sort-05-insert sort 插入排序算法详解
这是一个关于排序算法的系列文章总结,包括冒泡排序、快速排序、选择排序、堆排序、插入排序等10种排序算法的详细讲解和Java实现。插入排序是一种简单直观的排序算法,通过构建有序序列并逐个插入新元素来排序。提供的Java代码展示了插入排序的实现过程,并附有测试示例。所有算法已开源在GitHub项目[https://github.com/houbb/sort](https://github.com/houbb/sort)中。
|
19天前
|
人工智能 算法 搜索推荐
归并排序——“数据结构与算法”
归并排序——“数据结构与算法”
|
19天前
|
人工智能 算法 搜索推荐
直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”
直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”
|
19天前
|
搜索推荐 C语言 C++
【排序算法】C语言实现归并排序,包括递归和迭代两个版本
【排序算法】C语言实现归并排序,包括递归和迭代两个版本