排序算法之插入排序

待我称王封你为后i 2022-09-25 15:23 294阅读 0赞

同样的先上这张图

Center

下面分析插入排序:

插入排序每次取一个元素插入到已排好序的序列中。

由于前面的序列已经排好序,我们只需要从这个序列的后面开始查找,找到第一个大于待插入元素的位置,将该位置后面的元素全部往后移一个位置,并把待排元素插入到该位置之后。

插入排序外层循环选择待排元素,时间复杂度为O(n),内层循环找插入位置,最好情况是直接插入到最后,时间复杂度为O(1),最坏情况可能是插入到开头,时间复杂度为O(n),所以插入排序最好情况时间复杂度为O(n),平均情况和最坏情况时间复杂度为O(n2)。

插入排序不需要额外的辅助空间,空间复杂度为O(1)。

如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面,所以插入排序是稳定的。

AS3代码:

  1. /**
  2. * 插入排序
  3. * 外层循环选择待插入元素
  4. * 内层循环查找插入位置并将该位置后面元素后移
  5. */
  6. private function InsertSort(arr:Array):void{
  7. var x:Number,j:Number;
  8. //外层循环从1到n-1,选择待插入元素
  9. for(var i:uint=1;i<arr.length;i++){
  10. //如果arr[i]>=arr[i-1]直接插入到最后
  11. if(arr[i]<arr[i-1]){
  12. //复制为哨兵
  13. x=arr[i];
  14. j=i-1;
  15. while(x<arr[j] && j>=0){
  16. arr[j+1]=arr[j];
  17. j--;
  18. }
  19. arr[j+1]=x;
  20. }
  21. }
  22. }

c++代码

  1. /*
  2. * 插入排序
  3. * 外层循环遍历待插入元素
  4. * 内层循环从已排好序元素中查找插入位置
  5. * 最好情况O(n),最坏和平均情况O(n2)
  6. * O(1)
  7. * 稳定
  8. */
  9. template <typename T>
  10. void SortHelp<T>::insertSort(T l[], int length) {
  11. int temp, j;
  12. for (int i = 1; i < length; i++)
  13. {
  14. //查找插入位置的同时将元素往后移
  15. j = i - 1;
  16. temp = l[i];
  17. while (l[j] > temp && j >= 0)
  18. {
  19. l[j + 1] = l[j];
  20. j--;
  21. }
  22. //插入
  23. l[j + 1] = temp;
  24. }
  25. }

总结,插入排序最好时间复杂度为O(n),最坏及平均时间复杂度为O(n2);空间复杂度为O(1),稳定。

发表评论

表情:
评论列表 (有 0 条评论,294人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法插入排序

    \[插入排序-普通插入排序\] 1.算法思想 将元素a视为基序列,遍历数组将元素a右边的元素依次插入序列中,找到比自己小的数置于其后,保证序列一直处于已排序的状态

    相关 排序算法插入排序

    插入排序> 对于排序相信大家都不陌生,就是将一组数据按照从大到小(降序)或者是从小到大(升序)进行排列,那仫常见的排序算法有哪些呢?我总结了以下几种常见的排序算法,在本篇文

    相关 排序算法插入排序

    插入排序类似于打扑克,取出未排序的一张牌插入到已排序的牌中,取出的一张牌是在已排序好的牌中从后向前查找,直到查找到比当前牌小的那个位置,然后插入进去 示例代码: \[9, 1