排序算法----插入排序
插入排序的基本思想是当排到位置 i 的时候,前面的所有元素都是有序的,但不保证都处于最终位置上,即可能后面有可能插入新的元素,而这插入的过程就是当前位置 i 上的元素向前插入,直到不能再插入为止。
例如一个数组经过几趟插入排序后是[1,3,4,2,6],此时应该排 i = 3,那么元素2就要与前一个元素4比较,发现元素4大于自己,就进行交换。然后在继续向前重复这个过程直到前一个元素小于2或者已经交换到了第一个位置。利用前面元素有序,还可以进行优化,即折半插入排序。
package young.unit01; public class T05_InsertionSort { /** * * 比较次数 :|最少:数组本来升序 只要比较n-1次 * |最多:数组本来逆序 比较1+2+...+(n-1) = n^2 * 交换次数: |最少 0次 * |最多 n^2 * 时间复杂度 最好(O(N))---只要逐次遍历数组一遍,每遍历一个数只有一次比较操作,常数时间 * 最坏/平均(O(N^2))---1+2+3+...+(n-1) = n^2 每遍历一个数,比较以及插入次数不同 * * 稳定性:可以做到稳定性 * 每插入一个数,在往前面有序数组比较准备插入到合适位置时,发现前面的数小于等于自己时,就停下 * 也就是相等时不交换 * @param: @param nums * @return: void */ public static void insertionSort(int[] nums) { if (nums == null || nums.length < 2) { return; } for (int i = 1; i < nums.length; i++) { for (int j = i; j > 0 && nums[j] < nums[j - 1]; j--) { swap(nums, j - 1, j); } } } private static void swap(int[] nums, int i, int j) { int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; } }
浙公网安备 33010602011771号