一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args){
int [] arr = new int[]{9,8,5,7,12,2,4,6,10,1,3,11};
int insertnumber = 0;
if((arr.length == 0) || (arr.length == 1)){ // 数组长度为0或1,不用排序
System.out.println(Arrays.toString(arr));
return;
}
for(int i =1;i < arr.length;i++){
insertnumber = arr[i]; //当前待插入元素
int j = i;
for(;j >= 1 && insertnumber < arr[j-1];j--){ //这里不明白为什么j写在for循环里面就不对,写在外面就对?
arr[j] = arr[j-1];
}
arr[j] = insertnumber;//比较过程中不对待插入数进行交换,只在最后插入进数组对应位置
}
System.out.println(Arrays.toString(arr));
}
}
参考
Java编程入门,插入排序(Insertion Sort)怎么做?
import java.util.Arrays;
public class InsertSort {
// https://zhuanlan.zhihu.com/p/127839844
public static void main(String[] args) {
int [] arr = new int[]{9,8,5,7,12,2,4,6,10,1,3,11};
if (arr == null || arr.length <= 1) {
return;
}
int length = arr.length;
// 要插入的数
int insertNum;
for (int i = 1; i < length; i++) {
insertNum = arr[i];
// 已经排序好的元素个数
int j = i - 1;
while (j >= 0 && arr[j] > insertNum) {
// 从后到前循环,将大于insertNum的数向后移动一格
arr[j + 1] = arr[j];
j--;
}
// 将需要插入的数放在要插入的位置
arr[j + 1] = insertNum;
}
System.out.println(Arrays.toString(arr));
}
}
输出
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]