回头看了一下排序的内容,这边给出一个插入排序的算法实现,一些注意点在代码的注释里面都有写,有的博主的代码存在一些数组越界的错误,这边给予一个更正。
要不先说一下插入排序的思想吧,直接插入排序的基本操作是将一个记录插入到已经排好的有序表中,从而得到一个新的、记录数增1的有序表。对于给定的一组记录,初始时假定第一个记录自成一个有序序列,其余记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直到最后一个记录插到有序序列中为止,说实话,看不懂。
以数组{38,65,97,76,13,27,49}为例,
我们选择38作为有序表的第一个数,第一趟排序如图所示,后面每次将为排序的数往排好的数里面插入,比如第三趟排序,我们选择未排序的数字是97,我们只需找到97在有序表中的位置,插入即可,得到第三趟排序后的结果,如图。
下面是代码
public class InsertSort {
public static void insertSort(int[] a) {
int temp;
int k;
for (int i = 1; i < a.length; i++) {
if (a[i] < a[i - 1]) { // 若第i个元素大于i-1元素,即进入下一个循环,该数放的位置就是有序表的最后
//小于的话,需要找到插入位置,即进入if代码块
int x = a[i]; //x就是我们需要插入的元素
a[i] = a[i - 1];//这个表示有序表插入一个数后a[i]是当前有序表最大值,其值为a[i];
int j = i - 1;//j是下面循环的变量,从i-1的位置往前找位置插入
while (j >= 0 && x < a[j]) { // 查找在有序表的插入位置,x每次和有序表中的元素比较,若小于,继续比较。这里的j>=0为了防止数组越界 -1
//可以将j>=0删去,在执行代码,看看报错
a[j + 1] = a[j];// 元素后移,这里将前一个元素的值赋给后一个
j--;
}
a[j + 1] = x;//这个位置是找到的位置
}
}
for (int num : a) {
System.out.println(num);
}
}
public static void main(String args[]) {
int a[] = { 9, 2, 2, 3, 4, 1, 8, 9 };
insertSort(a);
}
}
建议小伙伴能够在纸上自己从i=1开始演示一下整个过程,就能够容易理解整个算法,特别是其中防止数组越界的条件j>=0,有的博主的代码问题就是出现在这里。