插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
插入排序法思想:
插入排序(Insertion Sorting)的基本思想是:
把n个待排序的元素看成为一个有序表和一个无序表,
开始时有序表中只包含一个元素,无序表中包含有n-1个元素,
排序过程中每次从无序表中取出第一个元素,
把它的排序码依次与有序表元素的排序码进行比较,
将它插入到有序表中的适当位置,使之成为新的有序表。
package com.zx.ds.ds0731;
//插入排序
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int array[]={3,2,4,1};
System.out.println("before sort: ");
System.out.println(Arrays.toString(array));
/**
* 3 2 4 1
*
* 2 3 4 1
*
* 2 3 4 1
*
* 1 2 3 4
*/
//使用逐步推导的方式实现
//从arrray[1]开始插入 前面只有array[0]
//和array[0]进行比较 array[1]<array[0] 将array[0]后移 array[0]=insertVal
int insertVal=array[1];
int insertIndex=1-1;
while(insertIndex>=0&&insertVal<array[insertIndex]){
array[insertIndex+1]=array[insertIndex];
insertIndex--;
}
array[insertIndex+1]=insertVal;
System.out.println("1: ");
System.out.println(Arrays.toString(array));
insertVal=array[2];
insertIndex=2-1;
while(insertIndex>=0&&array[insertIndex]>insertVal){
array[insertIndex+1]=array[insertIndex];
insertIndex--;
}
array[insertIndex+1]=insertVal;
System.out.println("2: ");
System.out.println(Arrays.toString(array));
insertVal=array[3];
insertIndex=3-1;
while(insertIndex>=0&&array[insertIndex]>insertVal){
array[insertIndex+1]=array[insertIndex];
insertIndex--;
}
array[insertIndex+1]=insertVal;
System.out.println("3: ");
System.out.println(Arrays.toString(array));
System.out.println("after sort: ");
System.out.println(Arrays.toString(array));
}
}
//
before sort:
[3, 2, 4, 1]
1:
[2, 3, 4, 1]
2:
[2, 3, 4, 1]
3:
[1, 2, 3, 4]
after sort:
[1, 2, 3, 4]
使用for循环简化代码
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class InsertSort2 {
public static void sort(int array[]) {
int insertval = 0;
int insertIndex = 0;
// 给insertVal 找到插入的位置
// 说明
// 1. insertIndex >= 0 保证在给insertVal 找插入位置,不越界
// 2. insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置
// 3. 就需要将 arr[insertIndex] 后移
for (int i = 1; i < array.length; i++) {
insertIndex = i - 1;
//待插入的数
insertval = array[i];
while (insertIndex >= 0 && array[insertIndex] > insertval) {
array[insertIndex + 1] = array[insertIndex];
insertIndex--;
}
// 当退出while循环时,说明插入的位置找到, insertIndex + 1
// 这里我们判断是否需要赋值
if(insertIndex+1!=i){
array[insertIndex + 1] = insertval;
}
//System.out.println("---"+i+"---");
//System.out.println(Arrays.toString(array));
}
}
//降序
public static void sort2(int array[]) {
int insertval = 0;
int insertIndex = 0;
for (int i = 1; i < array.length; i++) {
insertIndex = i - 1;
insertval = array[i];
while (insertIndex >= 0 && array[insertIndex] < insertval) {
array[insertIndex + 1] = array[insertIndex];
insertIndex--;
}
array[insertIndex + 1] = insertval;
//System.out.println("---"+i+"---");
//System.out.println(Arrays.toString(array));
}
}
public static void main(String[] args) {
int array[] = {3, 2, 4, 1};
System.out.println("before sort: ");
System.out.println(Arrays.toString(array));
sort(array);
System.out.println("after sort: ");
System.out.println(Arrays.toString(array));
sort2(array);
System.out.println("after sort2: ");
System.out.println(Arrays.toString(array));
int big[] = new int[80000];
for (int i = 0; i < big.length; i++) {
big[i] = (int) (Math.random() * 8000000);
}
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateToStr = simpleDateFormat.format(date);
System.out.println("before sort: " + dateToStr);
sort(big);
Date date2 = new Date();
SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateToStr2 = simpleDateFormat2.format(date2);
System.out.println("after sort: " + dateToStr2);
}
}
//
before sort:
[3, 2, 4, 1]
after sort:
[1, 2, 3, 4]
after sort2:
[4, 3, 2, 1]
before sort: 2020-07-31 21:42:48
after sort: 2020-07-31 21:42:50
排序法 | 平均时间 | 最差情形 | 稳定度 | 额外空间 | 备注 | 80000随机数排序时间(s) |
---|---|---|---|---|---|---|
冒泡 | O(n²) | O(n²) | 稳定 | O(1) | n小时较好 | 13 |
选择 | O(n²) | O(n²) | 不稳定 | O(1) | n小时较好 | 4 |
插入 | O(n²) | O(n²) | 稳定 | O(1) | 大部分已排序时较好 | 2 |