|
| 1 | +package org.lhn.insertionsort; |
| 2 | + |
| 3 | +import org.lhn.util.SortTestTools; |
| 4 | + |
| 5 | +/** |
| 6 | + * Created With IntelliJ IDEA |
| 7 | + * User: LiHaiNan |
| 8 | + * Date: 2016/12/26 0026 |
| 9 | + * Time: 下午 5:23 |
| 10 | + * 插入排序算法O(n^2) 级别的 |
| 11 | + */ |
| 12 | +public class InsertionSort { |
| 13 | + |
| 14 | + //理论上说:插入排序比选择排序效率要高,因为插入排序可以提前结束循环查找,但真的是如此吗? |
| 15 | + //其实并不是,因为在比较的同时,他还在不停地执行SortTestTools.swap(arr,j,j-1);交换,交换要比比较更加耗时。 |
| 16 | + //改进版,使其在内层循环中只交换一次 |
| 17 | + public static void main(String[] args) { |
| 18 | + System.out.println("**程序开始排序**"); |
| 19 | + int n = 1000; |
| 20 | + int[] arr = SortTestTools.randomArrayForInt(n, 100, n); |
| 21 | + long startTime = System.currentTimeMillis(); |
| 22 | + insertionSort(arr, n); |
| 23 | + long endTime = System.currentTimeMillis(); |
| 24 | + SortTestTools.printArray(arr); |
| 25 | + System.out.println("算法耗时:【" + (endTime - startTime) + "】毫秒"); |
| 26 | + } |
| 27 | + |
| 28 | + //插入排序 |
| 29 | + /* |
| 30 | + * 看当前位置的数比它前一个位置的数小,如果小就与前面的数交换位置, |
| 31 | + *以此类推 |
| 32 | + */ |
| 33 | + public static void insertionSort(int[] arr, int n) { |
| 34 | + //对于插入排序来说,数组的第一个位置的数默认是有序的 |
| 35 | + for (int i = 1; i < n; i++) { |
| 36 | + //寻找元素arr[i]合适的插入位置,这里使用j>0而不是j>=0是因为每一次都是把 |
| 37 | + //当前位置的元素和前一个位置的元素进行交换,所以最后发生的位置是j=1的时候 |
| 38 | + for (int j = i; j > 0 && (arr[j]<arr[j - 1]); j--) { |
| 39 | + //考察的是当前元素是否比前一个元素的值要小,yes交换位置 |
| 40 | + SortTestTools.swap(arr, j, j - 1); |
| 41 | + } |
| 42 | + } |
| 43 | + } |
| 44 | + |
| 45 | + //插入排序在数据有序性越强的情况下,效率越高,它会趋向于O(n) |
| 46 | + public static void insertionSortPro(Integer[] arr, int n) { |
| 47 | + //使其在内层循环只交换一次 |
| 48 | + for (int i = 1; i < n; i++) { |
| 49 | + //先把要考察的当前元素由e来保存一个副本 |
| 50 | + Integer e = arr[i]; |
| 51 | + int j;//j保存元素应该插入的位置 |
| 52 | + //如果arr[j - 1] > e说明不是我们要找的最终位置 |
| 53 | + for (j = i; j > 0 && e.compareTo(arr[j - 1])<0; j--) { |
| 54 | + //向后移位 |
| 55 | + arr[j] = arr[j - 1]; |
| 56 | + } |
| 57 | + arr[j] = e; |
| 58 | + } |
| 59 | + } |
| 60 | +} |
0 commit comments