这次排序算法的设计思想是从一个数组的1索引开始,进行数组的遍历,并且一直确保正在遍历的索引值之前的数据是有序的,每次遍历一个数据时,将其放置到合适的位置上即可,但是该算法的判断条件过多,会显得比较麻烦,且每次从后往前找到合适的位置时,都要平均将数组的一半大小的数据进行移动,因此,这次代码的实现仅仅是个人想法的实现.
外层循环用 i 去遍历整个数组,内层循环用j从后往前判断array[j]与array[i]的大小关系
该算法的弊端需要判断三种不同的情况,处理结果也不完全相同,为了简化代码,合并其中注释的条件,设置flag进行条件判断
代码如下:
import java.util.Arrays; public class InsertionSort { public static void insertSort(int[] array){ out: for (int i =1;i<array.length;i++){ int temp1 = array[i]; for(int j =i-1;j>=0;j--){ //在左侧找到比基准值小的数据,说明它的下一个数据就应该是array[i]的位置, //在该条件下,又应该判断是否进行值交换(即是否二者相邻,从而确定要不要进行将arra[j+1] = temp1) if((array[j]<temp1)) { boolean flag = false; for (int k = i - 1; k > j; k--) { array[k + 1] = array[k]; flag = true; } if (flag) { array[j+1] = temp1; } System.out.println(Arrays.toString(array)); continue out; } //若是左侧j遍历到0索引位置,且array[j]>temp1,说明该值应该放置在0索引位置,则需要将左侧的数据全部进行移动一位 if ((j==0&&array[j]>temp1)){ for (int k = i - 1; k >=j; k--) { array[k + 1] = array[k]; } array[0] = temp1; System.out.println(Arrays.toString(array)); } // 若是左侧j遍历到0索引位置,且array[j]<temp1,说明该值应该放置在0索引位置,则需要将左侧的数据全部进行移动一位 // if ((j==0&&array[j]<temp1)){ // for (int k = i - 1; k >j; k--) { // array[k + 1] = array[k]; // } // array[j+1] = temp1; // System.out.println(Arrays.toString(array)); // } } } } public static void main(String[] args) { int[] a ={-1,1,1,-9,-5,4,-10,0,8,-9,0,3,2}; insertSort(a); System.out.println(Arrays.toString(a)); } }
来源:CSDN
作者:keep gorgeous
链接:https://blog.csdn.net/zhouhe999/article/details/103650755