两种思维方式实现插入排序算法

* 思想

插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

* 算法步骤

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]+" ");
        }
    }
发布了30 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_40898368/article/details/88637369
今日推荐