vlambda博客
学习文章列表

【剑指Offer】七大排序算法——插入排序

插入排序是java中排序的一种,特点就是效率低,容易实现



一、插入排序原理

插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,算法适用于少量数据的排序,时间复杂度O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。


有一组数据,我们可以将这些数据分为有序组和带插入组。每次从待插入组中取出第一个元素,与有序组的元素从 后往前进行比较 并找到合适的位置,将该元素插到有序组当中。直到待插入组元素个数为0。每次插入的元素,都会进行判断找到合 适的位置,其实插入排序就相当于选择排序的一种逆序实现。



二、直接插入排序时间复杂度


直接插入排序在最好情况下,需要比较n-1次,无需交换元素,时间复杂度为O(n);


在最坏情况下,时间复杂度为O(n2)。


但是在数组元素随机排列的情况下,插入排序还是要优于上选择排序和冒泡排序的。



三、稳定性

插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。


四、插入排序图解





五、步骤实现:

  1. 首先比较数组的前两个数据,并排序;

  2. 比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置;


  3. 比较第四个元素与前三个排好序的数据,并将第四个元素放入适当的位置;

  4. ....

  5. 每次排序后,我们都可以确定一个值的位置,直至把最后一个元素放入适当的位置。



六、代码实现

package cn.dzp.flyroc.day01;
import java.util.Arrays;
public class InsertSortDemo {
public static void main(String[] args){
int[] arr ={8,3,2,5,4,7}; System.out.println("这是排序前的结果:"+Arrays.toString(arr)); System.out.println("--------------------------------------------------"); insertSort(arr);
}
//直接插入排序 public static void insertSort(int[] arr){
int temp; //(优化代码,不用每次执行循环的时候,都要给temp分配内存空间) for (int i = 1; i < arr.length; i++){ //遍历数组 temp = arr[i]; //记录待插入的元素
int j; //记录待插入元素之前的所有元素 for (j = i -1; j >= 0; j--){ if (arr[j] > temp){ arr[j+1] = arr[j]; }else { break; } } arr[j+1] = temp; System.out.println("这是第"+i+"次"+"插入排序后的结果:"+ Arrays.toString(arr)); } }}




【剑指Offer】算法系列,本人会持续写出代码实现过程,敬请期待,请持续关注大数据健身侠: