zoukankan      html  css  js  c++  java
  • 算法学习记录-排序——插入排序(Insertion Sort)

    插入排序:

    在《算法导论》中是这样描述的

    这是一个对少量元素进行排序的有效算法。插入排序的工作机理与打牌时候,整理手中的牌做法差不多。

    在开始摸牌时,我们的左手是空的,牌面朝下放在桌子上。接着,一次从桌子上摸起一张牌,并将它插入到左手一把牌中的正确位子上。

    为了找到这个正确的位置,要将它与手中已有的每一张牌从右到左进行比较,无论什么时候,左手的牌都是排好序的。

    算法思想:

    将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数加1的有序表。

    图解:

    每一张图都是一个for循环。红色和绿色的表示 左手的牌(排好序的数组)。

    以此类推。。。

    代码:

     1 void insertionSort(myDataType *ary,int len)
     2 {
     3     int i,j;
     4     myDataType key;
     5     for (i=1;i<len;i++) //第一步没有比较,直接从第二个数(下标为【1】的数开始)
     6     {
     7         key = ary[i]; //待插入的数
     8         
     9         //和已经排好序的数组依次比较
    10         j=i-1;
    11         while( j >= 0 ) //控制比较的数组是排好序的。排好序的最后一个元素下标为 【i-1】,我们从后往前比较,这样移位比较方便
    12         {
    13             if (key < ary[j] )
    14             {
    15                 myDataType temp = ary[j];
    16                 ary[j] = key;
    17                 ary[j+1] = temp;
    18             }
    19             j--;
    20         }
    21     }
    22 }

    完整代码:

     1 #include "stdafx.h"
     2 
     3 
     4 typedef int myDataType;
     5 myDataType src_ary[10] = {9,1,5,8,3,7,6,0,2,4};
     6 
     7 void prt_ary(myDataType *ary,int len)
     8 {
     9     int i=0;
    10     while(i < len)
    11     {
    12         printf(" %d ",ary[i++]);
    13     }
    14     printf("
    ");
    15 }
    16 void insertionSort(myDataType *ary,int len)
    17 {
    18     int i,j;
    19     myDataType key;
    20     for (i=1;i<len;i++) //第一步没有比较,直接从第二个数(下标为【1】的数开始)
    21     {
    22         key = ary[i]; //待插入的数
    23         
    24         //和已经排好序的数组依次比较
    25         j=i-1;
    26         while( j >= 0 ) //控制比较的数组是排好序的。排好序的最后一个元素下标为 【i-1】,我们从后往前比较,这样移位比较方便
    27         {
    28             if (key < ary[j] )
    29             {
    30                 myDataType temp = ary[j];
    31                 ary[j] = key;
    32                 ary[j+1] = temp;
    33             }
    34             j--;
    35         }
    36     }
    37 }
    38 
    39 int _tmain(int argc, _TCHAR* argv[])
    40 {
    41     printf("before sort:
    ");
    42     prt_ary(src_ary,10);
    43 
    44     //bubble_sort(src_ary,10);
    45     //bubble_sort_modify1(src_ary,10);
    46     //bubble_sort_opt(src_ary,10);
    47     //selectionSort(src_ary,10);
    48     insertionSort(src_ary,10);
    49 
    50     printf("after sort:
    ");
    51     prt_ary(src_ary,10);
    52 
    53 
    54 
    55     getchar();
    56     return 0;
    57 }
  • 相关阅读:
    mysql常用基本命令
    mysql8.0.13下载与安装图文教程
    k8s ingress 增加跨域配置
    Jenkins 备份恢复插件 thinBackup 使用
    k8s HA master 节点宕机修复
    nginx 跨域问题解决
    mongodb 3.4.24 主从复制
    k8s 线上安装 jenkins并结合 jenkinsfile 实现 helm 自动化部署
    k8s helm 运用与自建helm仓库chartmuseum
    centos6 源码安装 unzip
  • 原文地址:https://www.cnblogs.com/jsgnadsj/p/3457818.html
Copyright © 2011-2022 走看看