【剑指Offer】七大排序算法——插入排序
插入排序是java中排序的一种,特点就是效率低,容易实现
一、插入排序原理
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,算法适用于少量数据的排序,时间复杂度O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
有一组数据,我们可以将这些数据分为有序组和带插入组。每次从待插入组中取出第一个元素,与有序组的元素从 后往前进行比较 并找到合适的位置,将该元素插到有序组当中。直到待插入组元素个数为0。每次插入的元素,都会进行判断找到合 适的位置,其实插入排序就相当于选择排序的一种逆序实现。
二、直接插入排序时间复杂度
直接插入排序在最好情况下,需要比较n-1次,无需交换元素,时间复杂度为O(n);
在最坏情况下,时间复杂度为O(n2)。
但是在数组元素随机排列的情况下,插入排序还是要优于上选择排序和冒泡排序的。
三、稳定性
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
四、插入排序图解
五、步骤实现:
首先比较数组的前两个数据,并排序;
比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置;
比较第四个元素与前三个排好序的数据,并将第四个元素放入适当的位置;
....
每次排序后,我们都可以确定一个值的位置,直至把最后一个元素放入适当的位置。
六、代码实现
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】算法系列,本人会持续写出代码实现过程,敬请期待,请持续关注大数据健身侠: