废话少说,直接上代码
public class InsertSort {
public static void main(String[] args) {
int[] arr = {5,8,0,2,3,1};
printArr(arr);
insertSort2(arr);
printArr(arr);
}
private static void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
private static void printArr(int[] arr){
System.out.println(Arrays.toString(arr));
}
private static void insertSort(int[] arr){
for (int i = 1;i< arr.length;i++){
//存i的位置
int nowNumPosition=i;
//这个循环是从i位置开始 往前比比较数值
// 一旦发现有比这个位置的值大 立刻交换位置 并且更新nowNumPosition的位置
for (int j =i-1;j>=0;j--){
if (arr[j]>arr[nowNumPosition]){
swap(arr,j,nowNumPosition);
nowNumPosition--;
}
}
}
}
private static void insertSort2(int[] arr){
for (int i = 1;i< arr.length;i++){
//存i的位置
int nowNumPosition=i;
//这个循环是从i位置开始 往前比比较数值
// 一旦发现有比这个位置的值大 立刻交换位置 并且更新nowNumPosition的位置
// for (int j =i-1;j>=0;j--){
// if (arr[j]>arr[nowNumPosition]){
// swap(arr,j,nowNumPosition);
// nowNumPosition--;
// }
// }
while (nowNumPosition-1>=0&&arr[nowNumPosition-1]>arr[nowNumPosition]){
swap(arr,nowNumPosition,nowNumPosition-1);
nowNumPosition--;
}
}
}
private static void insertSort3(int[] arr){
for (int end=1;end<arr.length;end++){
for (int pre = end-1;pre>=0&&arr[pre]>arr[pre+1];pre--){
swap(arr,pre,pre+1);
}
}
}
}
解析
1.有一个打印数组的函数 用于观察是否进行了排序
2.写了三个个插入排序方法 一个内嵌for循环 一个内嵌while while循环更简单易理解,第三个是对其进行优化,不用使用if(){}
3.一个排序交换方法 swap(),这个方法用于每次的位置的交换