zoukankan      html  css  js  c++  java
  • 排序算法——直接插入排序

    直接插入排序:

      有一些教材上(我使用的教材就是如此)把直接插入排序理解成“存在两表”,一个有序,一个无序,每次从无序表中取出元素,插入到有序表中的合适的位置中,使得“有序表”仍然有序,如此循环操作,最后得到一个有序的列表。我个人这样并觉得不好理解(当时我就一直在找那两个表在哪里??哈哈,搞笑)。

      经过我个人的理解消化之后,思路大概是这样的:举个例子,假设一个待排序的序列{57,68,59,52,60}

      首先,第一轮,从第2个元素,也就是68开始,与第1个元素(57)进行比较,68>57,那么两个保持原来的位置,不换位,所以该序列还是{57,68,59,52,60}

      第二轮,到第3个元素(59)进行排序,拿59和前面的元素比较,一旦发现有比它大的元素,那么程序就会把那个大的元素后移。那么现在可以看到,当它比较到68时,发现68>59,于是68后移一位,那么68原来的位置就空了出来,59再往前与57比较,57<59,那么比较结束,57就填补到68之前的位置,即第二位。于是该序列现在就成了{57,59,68,52,60}

      轮,到第4个元素(52)进行排序操作,比较的方式还是和之前的一样,一旦发现有比它大的元素,就暂停,将大的那个元素后移一位。那么可以知道,68、59、57都会后移一位,那么这个序列的第1的位置就空了出来,那么52会插入到第1的位置,所以,现在的序列为{52,57,59,68,60}

    轮,同理,我们这下就很快地知道,在这一轮里,68会后移一位,60插到第4的位置,序列变成{52,57,59,60,68}

      至此,排序结束。

     

    总结一下:

      直接插入排序的思想大概就是:将待排序的元素array[i]与前面的已经排好序的元素(这就是部分教材上所说的的“有序表”部分)进行比较,查找到合适的“安身之所”,部分元素整体后移一位,腾出位置给元素array[i],使“有序”部分依然有序,如此循环操作,最后就会得到一个有序的序列表,排序的次数为n-1轮(n为待排序元素个数)。

      实现代码:

      结果输出:

  • 相关阅读:
    剑指offer——最小的K个数和数组中第K大的元素
    Leetcode刷题指南链接整理
    160. Intersection of Two Linked Lists
    100. Same Tree
    92. Reverse Linked List II
    94. Binary Tree Inorder Traversal
    79. Word Search
    78,90,Subsets,46,47,Permutations,39,40 DFS 大合集
    0x16 Tire之最大的异或对
    0x16 Tire
  • 原文地址:https://www.cnblogs.com/Mus-Li/p/6403934.html
Copyright © 2011-2022 走看看