插入排序,好比是洗扑克一样,我们将牌分作两堆,每次从后面一堆的牌抽出最前端的牌,然后插入前面一堆牌的适当位置,例如:
排序前: [92], 77, 67, 8, 6, 84, 55, 85, 43, 67 -- 将数组分为两部分,第一个元素为一组
第 1 次排序:[77 92] 67 8 6 84 55 85 43 67 -- 将后一组的第一个元素 77 插入前一组的适当位置
第 2 次排序:[67 77 92] 8 6 84 55 85 43 67 -- 将后一组的第一个元素 67 插入前一组的适当位置
第 3 次排序:[8 67 77 92] 6 84 55 85 43 67 -- 将后一组的第一个元素 8 插入前一组的适当位置
第 4 次排序:[6 8 67 77 92 84] 55 85 43 67 -- 将后一组的第一个元素 6 插入前一组的适当位置
第 5 次排序:[6 8 67 77 84 92 55] 85 43 67 -- 将后一组的第一个元素 84 插入前一组的适当位置
第 6 次排序:[6 8 55 67 77 84 92 85] 43 67 -- 将后一组的第一个元素 55 插入前一组的适当位置
第 7 次排序:[6 8 55 67 77 84 85 92 43] 67 -- 将后一组的第一个元素 85 插入前一组的适当位置
第 8 次排序:[6 8 43 55 67 77 84 85 92] 67 -- 将后一组的第一个元素 43 插入前一组的适当位置
第 9 次排序:[6 8 43 55 67 67 77 84 85 92] -- 将后一组的第一个元素 67 插入前一组的适当位置
Java代码实现,如下:
/** * 插入排序 * @param data:等代排序整型数组 * data = { 92, 77, 67, 8, 6, 84, 55, 85, 43, 67 } * 排序结果: * 第 1 次排序:77 92 67 8 6 84 55 85 43 67 * 第 2 次排序:67 77 92 8 6 84 55 85 43 67 * 第 3 次排序:8 67 77 92 6 84 55 85 43 67 * 第 4 次排序:6 8 67 77 92 84 55 85 43 67 * 第 5 次排序:6 8 67 77 84 92 55 85 43 67 * 第 6 次排序:6 8 55 67 77 84 92 85 43 67 * 第 7 次排序:6 8 55 67 77 84 85 92 43 67 * 第 8 次排序:6 8 43 55 67 77 84 85 92 67 * 第 9 次排序:6 8 43 55 67 67 77 84 85 92 */ public void insertSort( int data[]) { int k, temp, max = data.length; for ( int i = 1 ; i < max; i ++ ) { temp = data[i]; // 后一组的第一个元素 k = i - 1 ; // 从前一组的最后一个元素开始比较 while (temp < data[k]) { data[k + 1 ] = data[k]; // 如果前一组元素大于后一组第一个元素,则后移 k -- ; if (k == - 1 ) break ; // 如果前一组元素比较完,则跳出 } data[k + 1 ] = temp; // 插入适当的位置 System.out.print( " 第 " + i + " 次排序: " ); for ( int j = 0 ; j <= max - 1 ; j ++ ) { System.out.print(data[j] + " " ); } System.out.println(); } }