插入排序分析与实现

分析思路如下:

插入排序的实现思想是:将数组看作两部分,一部分为有序,另外一部分是无序的,是需要进行排序的部分。将无序的数据一个一个进行遍历,并与有序的元素进行比较,从而进行排序。

以从小到大排序、左边有序,右边无序进行分析:

将右边需要处理的元素取出来,赋值给临时变量temp,如果左边的元素比该数据要大,将左边的元素进行右移,当左边的元素比该数据要小时,停止比较,将该数据插入即可。

示意图如下:

代码实现如下:

private void sort(int[] a){
        int left;
        //初始条件下默认左边为0的部分的区域是有序的,从1到数组末尾的元素时无序的。
        for(int right= 1; right < a.length; right++){
            //从第一个元素进行比较,因为该元素后续要进行移动,需要将该元素先取出来赋值给一个临时变量。该元素所在的位置后续可能被其他元素进行填充
            int temp = a[right];
            //从in开始到最左边的区域都是有序的,相当于一个数组从中间被分开成了两半。左边是有序的,右边是无序的。从左边数组的最右边的那个元素开始进行比较
            left = right-1;
            //当左边进行比较的元素存在时(left有可能为-1),且该元素比进行比较的元素要大时,该元素进行右移,同时将left--指向下一个需要进行比较的元素
            while(left >= 0  && a[left] > temp ){
                a[left+1] = a[left];
                left--;
            }
            //执行到该步说明a[left]元素比temp要小,说明temp应该插入的区域为该元素的下一个,即left+1
            //另外一种情况是left=-1,此时已经不满足while条件,说明temp应当插入的区域为(left+1),即下标为0
            a[left+1] = temp;
        }       
    }

你可能感兴趣的:(数据结构与算法)