Hark的数据结构与算法练习之插入排序
算法说明:
先是拿语言进行一下描述:
假如是做降序排序,那么从头开始扫描每个数字,使每个数字与它前面的若干数字进行比较,直接找到小于当前数字a(当前数字以a代替)的数字b(小于a的数字以b代替)。 然后将数字a插入到数学b的位置。将数字b到数字a前一位的数字向后移动一位。 至此,排序结束。
语言表述其实懂这个算法的人能会懂,不懂这个算法的人不太容易看懂,所以还是以例子做一下说明:
例如有一个数组int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3 ,8},一共9个元素。
假设是降序排序。
先扫描第二个数,让它与它前面的数进行比较,这时前两个数是{5,9},9大于5,那么把9插入放到5的位置即arrayData[0],把5后移放到arrayData[1]
再扫描第三个数,这时因为前面排序所以前三个数就变成了{9,5,6},拿6先与前面的5比较,大于5,那么再往前扫描,与9比较,发现小于9,那么我们将6插入放到5的位置即arrayData[1],将5后移到arrayData[2]。
再扫描第四个数,这时前四个数就变成了{9,6,5,7}, 将7向前扫描进行比较,最终将7插入放到6的位置即arrayData[1],然后6后移放到arrayData[2],5后移放到arrayData[3]
以此类推,最后得出结果。
算法复杂度:
O(n2)
空间复杂度:
O(1)
代码:
使用语言:Java
/* * 插入排序 */ public class InsertionSorting { public static void main(String[] args) { int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3, 8 }; InsertionSortingMethod(arrayData); for (int integer : arrayData) { System.out.print(integer); System.out.print(" "); } } public static void InsertionSortingMethod(int[] arrayData) { int temp; int index; for (int i = 1; i < arrayData.length; i++) { temp = arrayData[i]; index = i - 1; while (index >= 0 && arrayData[index] < temp) { arrayData[index + 1] = arrayData[index]; index--; } arrayData[index + 1] = temp; } } }
结果:
9 8 7 6 5 4 3 2 1
论证算法复杂度:因为是双层循环,所以最坏算法复杂度是O(n2)。
论证空间复杂度:因为作为临时空间进行数据交换的是几个常量,所以空间复杂度是O(1)