什么是插入排序!简单的介绍一下它的思想(假设为升序):在已经排好序的数组内,插入新的元素,从后往前找,当找到某个比它小的数,则停止,并将它插入这个与上一个数之间。先给大家看个图:
具体算法描述如下:
1.从第一个元素开始,因为只有一个元素,所以它有序。
2.拿它后面的一个元素和它进行比较。
3.它后面的元素比它大,把他往后移,并把它后面的元素赋给它原来的位置。
4.重复3的动作,直到找到比它小或者相等的元素,将该元素插入到比它小的元素后面
5.重复2~5的操作
我们先来看看代码:
<span style="font-size:14px;"> public static void sort(int[] array){ for (int i = 1; i < array.length; i++){ int j = i - 1; int temp = array[i]; while((j >= 0) && (array[j] > temp)){ array[j + 1] = array[j]; j--; } array[j+1] = temp; } }</span>
private static void move(int[] array, int from, int to){ for(int i = to; i > from; i--){ array[i] = array[i - 1]; } } public static void sort1(int[] array){ for(int i = 1; i < array.length; i++) { int j = 0; boolean flag = false; while(!flag && (j < i)){ if (array[i] < array[j]) { flag = true; } j++; } if ((flag)) { int temp = array[i]; move(array, --j, i); array[j] = temp; } } }看起来就比上面复杂多了,所以还是推荐从后往前比较。
可以很轻易的得到,时间复杂度是O(n^2)的,空间复杂度是O(n) + O(1),最优时间复杂度为O(n).
原文地址:http://blog.csdn.net/u010233260/article/details/44983979