* 思想
插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
* 算法步骤
1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
一.第一种while循环
//插入排序,从小到大排
public class Straight_insert_sort {
public static void main(String[] args) {
int[] arr = new int[]{2,4,7,3,5,9,6};
int temp,j;
for(int i=0;i<arr.length;i++) { //从数组第一个元素开始排
temp=arr[i]; //排到哪个元素让其赋值给temp
j = i-1; //移位都是从那个元素左边的第一个开始判断,从而移位
while( j>0 && temp<arr[j] ) {
//与逻辑顺序不能反,要不然j减至-1会报数组越界异、、常
arr[j+1]=arr[j];
arr[j] = temp;
j--;
/*从右往左一个一个判断,如果它比左边元素小继续往左找,否则停下,保证此元素右边的数都大于他,左边的数都小于他
将比它大的元素全部右移一位,将此元素插入停下的j位置,此时是从小到大排序
反之如果是temp>arr[j],则是从大到小排序,循环终止条件不一样,但都是从右往左找*/
}
}
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
非常棒,已经解决了, 一切好像没有问题,然而事实不是这样的,路过的您可以尝试找找问题所在!
当我把数组改成int[] arr = new int[]{2,4,7,3,5,9,1};的时候,请看答案
那就是第一个没有排序,问题出现在如下请看
也就是说第一个没有排序 ,有些人可能会想把第二个位置改成j>=0即可,注意逻辑与顺序不能变,要不然会一直数组越界,或者直接改成如下形式
从第二个开始排也是可以的,因为排第一个元素的时候实际上不需要动
第二种:if,else
public static void main(String[] args) {
// 插入排序从小到大排序
int a[] = {10, 2, 3, 7, 4, 9, 8, 5, 6};
// 第一个元素默认是排好序的,不需要进行排序
for (int i=0; i<a.length; i++){
// 插入排序,每个元素和其前面的元素从右边开始进行比较,插入到合适的位置
int find = a[i];
// 从此元素左边最近的元素开始比较
for (int j=i; j>0; j--){
if (a[j] < a[j-1]){
int temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
} else {
a[j] = find;
break;
}
}
}
for (int i=0; i<a.length; i++){
System.out.print(a[i]+" ");
}
}