思路:
对位置i上的元素排序(设为升序)时(设为Ai),假设从0~(i-1)位置上的元素都已经全部排好序。
所以,只需要为Ai在已经排好序的元素中找到合适的位置,并将其插入即可。最朴素的插入算法是直接插入,即从i-1开始,如果Ai小于Ai-1,则交换这两个元素的位置。以此类推,直到比前一个元素大,或者已经被交换到了第一个位置,则结束。
代码:
package dataStructureAndAlgorithms;
public class InsertSort_directInsertSort {
public static void main(String args[]) {
int[] array = { 4, 2, 8, 9, 5, 7, 1, 6, 3 };
System.out.println("直接插入排序(升序):");
System.out.println("未排序数组顺序为:");
display(array);
System.out.println("-----------------------");
sort(array);
System.out.println("-----------------------");
System.out.println("经过排序后的数组顺序为:");
display(array);
System.out.println();
}
public static void sort(int[] array)
{
int length = array.length;
for(int i=1;i<=length-1;i++)
{
int j=i;
while(j>=1 && array[j] < array[j-1] )
{
int temp = array[j];
array[j] = array[j-1];
array[j-1]=temp;
j--;
}
System.out.println("结过第" + i+"轮排序:");
display(array);
}
}
public static void display(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
}
输出:
直接插入排序(升序):
未排序数组顺序为:
4 2 8 9 5 7 1 6 3
-----------------------
结过第1轮排序:
2 4 8 9 5 7 1 6 3
结过第2轮排序:
2 4 8 9 5 7 1 6 3
结过第3轮排序:
2 4 8 9 5 7 1 6 3
结过第4轮排序:
2 4 5 8 9 7 1 6 3
结过第5轮排序:
2 4 5 7 8 9 1 6 3
结过第6轮排序:
1 2 4 5 7 8 9 6 3
结过第7轮排序:
1 2 4 5 6 7 8 9 3
结过第8轮排序:
1 2 3 4 5 6 7 8 9
-----------------------
经过排序后的数组顺序为:
1 2 3 4 5 6 7 8 9