java-数组排序--插入排序
插入排序
想象着你的左手拿着一手好牌[1,1,1,2,6,6,6,9,9],此时你从桌面上又抽出一张牌[1],你将抽出的牌,从又往左,依次与左手的牌进行比较(只以数字进行对比),当抽出的牌第一次不再大于手中的牌,你将抽出的牌插入此牌的相邻右边,入[1,1,1,1,2,6,6,6,9,9],绿色为从右往左第一个抽出牌不再大的牌,红色为抽出的牌,这样你就回发现,虽然左手中的牌不断增加,但都将持续保持有序状态
插入排序同上方抽牌的例子相似,她将一个待排序数列分为左右两部分,并令左半部分为有序,右半部分为无序,每次从无序数列中取出一个数(无序部分最左端的一个数),并将其插入到有序数列中的合适位置(待排序数从右往左比较有序部分的元素,直到待排序数遇到第一个她不再大于的元素,此时待排序数将安置在此元素的右方),最开始,对于有序部分,其元素个数为0个,并在新元素的插入下不断增多,直到整个待排序数列有序
插入排序 - 方式一
方法将待排序数持续向左移动,直到待排序数不再大于前一个数
见图
上代码
1 public static void insertSort(int[] arr) { 2 3 for (int i = 0; i < arr.length; i++) { 4 for (int j = i; j > 0; j--) { 5 if(arr[j]<arr[j-1]) { 6 int tmp=arr[j]; 7 arr[j]=arr[j-1]; 8 arr[j-1]=tmp; 9 } 10 } 11 } 12 }
测试
public static void main(String[] args) { Sort.insertSort(new int[] {6,10,6,8,6,8,12,15,9,6,7}); }
插入排序 - 方式二
思想与上面的相同,只是方法避免了重复多次的相邻数据的交换,只在最后一步将待排序树插入到合适位置
上图
上代码
1 public static void insertSort(int[] arr) { 2 3 for (int i = 0; i < arr.length; i++) { 4 int j = i; 5 int tmp=arr[i]; 6 for (; j > 0 && tmp<arr[j-1]; j--) { 7 arr[j]=arr[j-1]; 8 } 9 arr[j]=tmp; 10 } 11 }
测试
public static void main(String[] args) { Sort.insertSort(new int[] {6,10,6,8,6,8,12,15,9,6,7}); }
如果有地方写的错误,或者有什么疑问与建议,欢迎大家提出来 愿与大家一同进步