如果不懂排序算法,就从插入排序开始吧

Posted Hello丶Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果不懂排序算法,就从插入排序开始吧相关的知识,希望对你有一定的参考价值。

前言

        最简单的排序算法之一是插入排序(insertion sort)。

思路

        插入排序的思路是这样的:

        插入排序:由N-1趟排序完成,对于i=1到N-1趟,保证从位置0到位置i上的元素为已排序状态(但不保证已排序的值一定小于未排序的值)。

过程:

  • 对于位置i,先把i位置的值保存起来,然后把i挖空。

  • 依次与前一个位置比较,比较i-1到0位置上的元素;

  • 若发现i对应的值小于某个位置的值,则将该位置的值往后移动一位;

  • 最后将tmp填入空位

        整个过程就是一个不停的往前插的过程,因此叫插入排序

        我们对数列:[2, 12, 6, 15, 8] 进行插入排序

如果不懂排序算法,就从插入排序开始吧

        其中,i=1和i=3趟都没发生交换。

代码

/*** 插入排序。由N-1趟排序完成,对于i=1到N-1趟,保证从位置0到位置i上的元素为已排序状态(* 但不保证已排序的值一定小于未排序的值)。* <p>* 过程:对于位置i,先把i位置的值保存起来,然后把i挖空。* 依次与前一个位置比较,比较i-1到0位置上的元素;* 若发现i对应的值小于某个位置的值,则将该位置的值往后移动一位;* 最后将tmp填入空位** 整个过程就是一个不停的往前插的过程,因此叫插入排序** @param a* @param <E>*/public static <E extends Comparable<? super E>> void insertionSort(E[] a) { int j; for (int i = 1; i < a.length; i++) { E tmp = a[i];//对于位置i,先把i位置对应的值保存起来,然后把i挖空 for (j = i; j > 0 && tmp.compareTo(a[j - 1]) < 0 ; j--) { a[j] = a[j - 1];//若发现i对应的值小于某个位置的值,则将该位置的值往后移动一位; } a[j] = tmp;//最后将tmp填入空位 }}

复杂度和稳定性

  • 时间复杂度假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1次,因此,插入排序的时间复杂度是

  • 插入排序稳定性直接插入排序是稳定的算法,它满足稳定算法的定义。

  • 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

万水千山总是情,点个 “好看” 行不行!!!

 

以上是关于如果不懂排序算法,就从插入排序开始吧的主要内容,如果未能解决你的问题,请参考以下文章

java实现经典排序算法

算法一看就懂之「 冒泡排序 」

冒泡排序和插入排序(简单排序方法完结)

希尔排序图解与代码

插入排序算法详解及代码实现

一分钟算法——插入排序