算法 直接插入排序

  1. 算法
    1. 把数组的前两个元素当作一个独立的数组,取最后一个元素(也就是独立数组最后一个元素),然后把前边的元素看作已经是排好序的
    2. 把数组的前三个元素看作是一个独立的数组,取最后一个元素(也就是独立数组的最后一个元素),然后把前边的元素看作是已经排好序的
    3. 一次类推,接下来是第四个,第五个。。。。。。
    4. 可以看出来这就是个递归,递归结束的标识是独立数组的最后一个一个元素的下标等于要排序的数组的长度( 这时候再处理就会溢出了的)
  2. 代码
    package direct_insertion_sort;
    
    import java.util.Arrays;
    
    public class DirectInsertionSortTest {
        private static   int[] testArr  = {9,8,7,16,6,5,4,3,2,1};
    
        public static void main(String[] args) {
            directInsertionsSort(testArr, 1);
            System.out.println(Arrays.toString(testArr));
        }
        
        private static  void directInsertionsSort(int []array, int currentIndex){
    //        递归结束的条件:如果已经到达了数组的终点,就结束,这里也有讲究,应该是currentIndex == array.length而不是currentIndex == array.length-1
    //        因为currentIndex == array.length-1的时候实际上是在处理最后一个元素,如果这时候结束递归的话最后一个元素就不会被处理到了
            if(currentIndex == array.length){
                return;
            }
    
    //        得到当前要进行操作的数组元素
            int currentValue = array[currentIndex];
    //        挨个遍历当前数组元素的每一个元素,如果发现要操作的元素比遍历到的元素小的话,
    //        就退出循环
            for(int i=0; i<currentIndex; i++){
    
                if(currentValue < array[i]){
    //                从这里开始是把当前遍历到的元素开始到要操作的元素的位置前一个元素位置,
    //                挨个往后移动一位,这样子操作的元素的位置前一个元素会到操作的元素的位置
    //                操作的元素会放在腾出来的便利到的元素的位置
    //                  具体的做法是:
    
    //                       1、这个循环的意思是从要操作的数的下标为开始,到遍历到比要操作的数小的下标位置,挨个往后挪array[currentIndex]被覆盖
    //                              没有关系,因为他就是要操作的元素,已经被保存起来的了。
                    for(int j = currentIndex; j > i; j--){
                        array[j] =  array[j-1];
                    }
    //                        2、将操作的数放到遍历到的元素的位置。
                    array[i] = currentValue;
                    break;
                }
            }
    //                      3、递归调用,实现对数组第二个元素起的每一个元素都进行操作
            directInsertionsSort(array, ++currentIndex);
        }
    
    }
    

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值