插入排序会造成大量数据搬移,建议在链表中使用
代码1:
int[] arr = {12,15,1,4,2};
for (int i = 0; i < arr.length; i++) {
for (int j = i; j >0; j--) {
if (arr[j]<arr[j-1]){
//交换
int temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}
改进代码:
for (int i = 0; i < arr.length; i++) {
int temp = arr[i];//定义待插入的数
int j=i-1;//arr[i]前面一个数的下标
//j>=0保证插入位置不越界
while (j >= 0 && temp < arr[j]){
arr[j+1]=arr[j];
j--; //和j>=0呼应,当j--到<0时,所有元素都移动结束
}
arr[j+1] = temp;//插入排序始终把待插入的元素放到啊让人[0]的位置插入,j+1始终等于0
}
System.out.println(Arrays.toString(arr));
}
如果后面的一个数小于前面的一个数,那么后面的一个数就是要放在前面的待插入的数(在这个数组中就是1),把待插入的数(1)前面的所有数(12,15)往后一位移动,把待插入的数放入最前面空出的位置(就是数组的第一位)