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)

 

posted @ 2015-03-11 16:38  HarkLee  阅读(281)  评论(0编辑  收藏  举报