所谓插入排序法,就是检查第i个数字, 如果在它的左边的数字比它大,进行交换, 这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。 插入排序法主要的回圈有两个变数: i和j,每一次执行这个回圈,就会将第i个数字放到左边恰当的位置去。 二、算法描述 1、从第一个元素开始,该元素可以认为已经被排序。 2、取出下一个元素,在已经排序的元素序列中从后向前扫描。 3、如果该元素(已排序)大于新元素,则将该元素移到下一位置。 4、重复步骤3,直到找到已排序的元素小于或者大于新元素的位置。 5、将新元素插入到该位置。 6、重复步骤2。 三、效率分析 如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况如下。 最好情况:序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。 最坏情况:序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。 直接插入排序属于稳定的排序,最坏时间复杂度为O(n^2), 最好时间复杂度为O(n),空间复杂度为O(1)。 插入排序的赋值操作是比较操作的次数加上(n-1)次。 因此,插入排序不适合对于数据量比较大的排序应用。 插入排序是稳定排序
算法实现:
package com.feixiang.platform.stu.math.sorting; /** * Created with IntelliJ IDEA. * Description: 插入排序 * @PackageName com.feixiang.platform.stu.math.sorting * @Author: ldwtxwhspring * @Date: 2020-05-22 下午1:01 * @Version: 1.0 */ @SuppressWarnings("DuplicatedCode") public class InsertSort { /** * 插入排序 升序 * @param array [array] * @return void * @author dwli * @date 2020/5/22 下午5:30 */ public static void insertSort(int[] array){ for(int i=1;i=0 && insertPointValues=0 && insertPointValues>array[insertPoint]){ //插入点值后移 array[insertPoint+1] = array[insertPoint]; //插入点标记前移 insertPoint--; } //把插入值放到指定位置 array[insertPoint+1] = insertPointValues; } } /** * 自定义选择排序类型, * @param array * @param sortType 该值只能是布尔值,true 升序 false 降序 * @return void * @author dwli * @date 2020/5/22 下午5:43 */ public static void insertSort(int[] array,boolean sortType){ for(int i=1;i= 0) && (sortType? (insertPointValues > array[insertPoint]):(insertPointValues < array[insertPoint]))){ //插入点值后移 array[insertPoint+1] = array[insertPoint]; //插入点标记前移 insertPoint--; } //把插入值放到指定位置 array[insertPoint+1] = insertPointValues; } } /** * 内部引用方法,实现数组转字符串,达到toString效果,类同重写tostring * */ private static String arraytoString(int[] objects){ StringBuilder sb = new StringBuilder(); sb.append("[ "); for(Object o:objects){ sb.append(String.valueOf(o)).append(","); } //删除多余追加的, sb.deleteCharAt(sb.length()-1); sb.append(" ]"); return sb.toString(); } public static void main(String[] args) { int[] array = new int[]{44,22,31,2,55,92,1,34,332,0,2,44}; insertSort(array); System.out.println(arraytoString(array)); insertSortDesc(array); System.out.println(arraytoString(array)); int[] array1 = new int[]{44,22,31,2,55,92,1,34,332,0,2,44}; insertSort(array1,true); System.out.println(arraytoString(array1)); int[] array2 = new int[]{44,22,31,2,55,92,1,34,332,0,2,44,1}; insertSort(array2,false); System.out.println(arraytoString(array2)); } }