直接插入排序
基本思想
每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。
- 从序列第一个元素开始,该元素可以认为已经被排序。
- 取出下一个元素,设为待插入元素,在已经排序的元素序列中从后向前扫描,如果该元素(已排序)大于待插入元素,将该元素移到下一位置。
- 重复步骤2,直到找到已排序的元素小于或者等于待排序元素的位置,插入元素。
- 重复2,3步骤,完成排序。
思路
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| package com.nanzx.sort;
import java.util.Arrays;
public class InsertSort { public static void main(String[] args) { int[] arr = { 4, 6, 8, 5, 9}; insertSort(arr); }
public static void insertSort(int[] arr) { int index = 1; insertValue = arr[1]; while (index > 0 && insertValue < arr[index - 1]) { arr[index] = arr[index - 1]; index--; } arr[index] = insertValue; System.out.println("第1轮后:"); System.out.println(Arrays.toString(arr)); index = 2; insertValue = arr[2]; while (index > 0 && insertValue < arr[index - 1]) { arr[index] = arr[index - 1]; index--; } arr[index] = insertValue; System.out.println("第2轮后:"); System.out.println(Arrays.toString(arr));
index = 3; insertValue = arr[3]; while (index > 0 && insertValue < arr[index - 1]) { arr[index] = arr[index - 1]; index--; } arr[index] = insertValue; System.out.println("第3轮后:"); System.out.println(Arrays.toString(arr)); index = 4; insertValue = arr[4]; while (index > 0 && insertValue < arr[index - 1]) { arr[index] = arr[index - 1]; index--; } arr[index] = insertValue; System.out.println("第4轮后:"); System.out.println(Arrays.toString(arr)); } }
|
运行结果
第1轮后:
[4, 6, 8, 5, 9]
第2轮后:
[4, 6, 8, 5, 9]
第3轮后:
[4, 5, 6, 8, 9]
第4轮后:
[4, 5, 6, 8, 9]
整合代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package com.nanzx.sort;
import java.util.Arrays;
public class InsertSort { public static void main(String[] args) { int[] arr = { 101, 34,-1, 119, 1 ,-2}; insertSort(arr); }
public static void insertSort(int[] arr) { int index,insertValue; for (int i = 1; i < arr.length; i++) { index = i; insertValue = arr[i]; while (index > 0 && insertValue < arr[index - 1]) { arr[index] = arr[index - 1]; index--; } arr[index] = insertValue; } } }
|
测试直接插入排序的速度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package com.nanzx.sort;
import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date;
public class InsertSort { public static void main(String[] args) { int[] arr = new int[80000]; for (int i = 0; i < 80000; i++) { arr[i] = (int) (Math.random() * 8000000); } Date data1 = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date1Str = simpleDateFormat.format(data1); System.out.println("排序前的时间是=" + date1Str);
insertSort(arr);
Date data2 = new Date(); String date2Str = simpleDateFormat.format(data2); System.out.println("排序后的时间是=" + date2Str);
}
public static void insertSort(int[] arr) { int index,insertValue; for (int i = 1; i < arr.length; i++) { index = i; insertValue = arr[i]; while (index > 0 && insertValue < arr[index - 1]) { arr[index] = arr[index - 1]; index--; } arr[index] = insertValue; } } }
|
排序前的时间是=2020-07-31 20:02:36 排序后的时间是=2020-07-31 20:02:38