知识点9:常见的排序算法–插入排序

插入排序的原理

我们在打扑克的时候,有没有在拿到牌后都重新整理一遍,方便自己打牌和出牌?我想会有吧。那么你们整理牌的方式是什么样的呢?我想应该都是把大的牌一张一张的往左边挪,直到所有的牌都从大到小排列吧。是的不管你们是不是这样,反正我的是这样~~。那么,你们比较大小的方式是什么呢?有人可能就说:那肯定是看牌在哪两个数字之间,直接插入进去,如果是最大的,就放左边啊。如果是这样,恭喜你,初步掌握了插入排序的基础。为什么是初步,而又是基础呢?这是因为你这还不是插入排序的思路,只是接近了而已。那么,什么才是插入排序的思路呢?别急,好戏后头,我们一起来揭晓吧!
好,插入排序法的整牌方式还有1分钟到达战场。
你已获得一副好牌,请从小到大进行整理(就喜欢不按常理整牌):
首先,把整理牌的过程看作一个循环,你有n张牌,就循环n-1遍。起步是第1张牌,终点是第n-1张牌
其次,假设你目前第n张牌,那么以第n张牌为范围,再进行一次循环。起点是n,终点是0
然后,我们以第n张牌进行比较,如果arr[1]小于arr[0],那么我们交换两者,然后从n-1起步,与n-2进行比较。直到arr[n-1]大于 arr[n-2],则推出循环,此时已经成排序
最后,没了~
看不懂,不怕,带着描述看代码最容易让人懂了

插入排序思路的实现

void insertSort(int[] arr){

    int length =arr.length;
    int nextIndex;
    int compareIndex;
    if(length>1){
        for(nextIndex = 1;nextIndex<length;nextIndex++){
            for(compareIndex=nextIndex;compareIndex>0;compareIndex--){
                if(arr[compareIndex]<arr[compareIndex-1){
                    int temp = arr[compareIndex];
                    arr[compareIndex] = arr[compareIndex-1];
                    arr[compareIndex-1] = temp;
                    }
                }else{
                        break;              
                }
            }
        }
    }

好了,看到这里,一个简单的思路实现就已经结束了。不知道大家对照着代码和前面的思路能不能对插入排序有所理解呢?如果没有,请多看几遍,建议画一下每一步的流程图来方便理解。
当然,以上代码还可以再次优化的,只是优化的地方在于美观。我们发现,我们在循环里面又用了一次的判断,但这个判断的实际意义不大,因此我们把他简化一下~

void insertSort(int[] arr){

    int length =arr.length;
    int nextIndex;
    int compareIndex;
    if(length>1){
        for(nextIndex = 1;nextIndex<length;nextIndex++){
            for(compareIndex=nextIndex;compareIndex>0&&arr[compareIndex]<arr[compareIndex-1]?1:0;compareIndex--){
                    int temp = arr[compareIndex];
                    arr[compareIndex] = arr[compareIndex-1];
                    arr[compareIndex-1] = temp;
                    }
            }
        }
    }

好啦,插入排序就介绍到这里,如果有疑问,欢迎评论指出,共同探讨~
下一章:常见的排序算法 ——希尔排序,敬请期待~

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页