直接插入排序,指每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。具體方法是第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個數據與前兩個數從前向後掃描,把第三個數按大小插入到有序表中;依次進行下去,進行了(n-1)趟掃描以後就完成了整個排序過程。它是由兩層嵌套循環組成的,外層循環標識並決定待比較的數值,內層循環爲待比較數值確定其最終位置。直接插入排序是將待比較的數值與它的前一個數值進行比較,所以外層循環是從第二個數值開始的。當前一數值比待比較數值大的情況下繼續循環比較,直到找到比待比較數值小的並將待比較數值置入其後一位置,結束該次循環。
算法描述
對一個有n個元素的數據序列,排序需要進行n-1趟插入操作:
第1趟插入,將第2個元素插入前面的有序子序列--此時前面只有一個元素,當然是有序的。
第2趟插入,將第3個元素插入前面的有序子序列,前面2個元素是有序的。
第n-1趟插入,將第n個元素插入前面的有序子序列,前面n-1個元素是有序的。
public class InsertSort {
public static void insertSort(int[] data) {
for (int i = 1; i < data.length; i++) {
// 得到i處的元素值
int tmp = data[i];
//判斷元素是否大於前面的有序列
if (data[i]<data[i-1]) {
//得到有序列的最後一個元素
int j=i-1;
//和前面有序列依次比較
while (j>=0&&data[j]>tmp) {
data[j+1]=data[j];
j--;
}
//找到了合適的位置
data[j+1]=tmp;
}
}
}
public static void main(String[] args) {
int[] data={8,6,7,1,4,7,6,4,9,8,5};
print(data);
insertSort(data);
print(data);
}
public static void print(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + "\t");
}
System.out.println();
}
}
結果爲:
8 6 7 1 4 7 6 4 9 8 5 1 4 4 5 6 6 7 7 8 8 9