插入排序的原理:将指针指向某元素(一般从第二个元素开始),假设该元素的左侧全部有序,将该元素抽取,然后按照从右往左的顺序分别与其左边的元素进行比较,遇到较大的元素便将较大的元素往右移,直到找到比该元素小的或者最左面发现其右侧的元素都比他大的时候,停止,此时会出现一个空位,将指针所指向的元素放到空位中,此时该元素左侧的元素都比他小,右侧的元素都比他大,此时指针向后移一位,重复进行上述操作,毎操作一轮,左侧有序元素就加一个,右侧无序元素就少一个。
原理不是很好懂,但是用实际操作来讲就很容易理解,给定一组数:297,34,56,12
第一轮:指针最初第二个元素34,从右向左开始比较一次,只有一个元素297,297>34,将297后移,空出一个位置,将34填进去
得到:34,297,56,12
第二轮:指针指向下一个元素,56,从右向左开始比较两次,有两个元素34,297,其中297大于56,34小于56,找到比自己小的元素了,297往后移,56填补空位
得到:34,56,297,12
第三轮:指针指向下一个元素,12,从右向左开始比较三次,有三个元素34,56,297,297,56,34都比12大,找不到比自己小的元素,其他元素往右移,空出第一个元素的位置,此时12填入
得到:1,34,56,297
int[]a={12,87,32,34,2,6}; int len=a.length; for (int i = 1; i < len; i++) {//从第二个元素开始从右往左比较 int temp=a[i];//将a【i】抽出来进行比较 int leftIndex=i-1;//左边元素索引值为i-1 while (leftIndex>=0&&a[leftIndex]>temp)//向右移 { a[leftIndex+1]=a[leftIndex];//左边元素值移到右边元素 leftIndex--;//如果左边还是大于右边,索引值往左,而且必须大于零在循环条件里面加上 }//移完之后,空出一个位置a[左边空出的索引,原本是i,后来变成了leftindex+1],需要用a【i】去填补 a[leftIndex+1]=temp; } System.out.println(Arrays.toString(a));
标签:56,leftIndex,插入排序,元素,34,12,297 From: https://www.cnblogs.com/Liku-java/p/16790241.html