• 算法学习记录-排序——插入排序(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 }
  • 相关阅读:
    linux内核主要模块图
    Linux0.11内核几种地址(逻辑地址、线性地址、物理地址)的含义
    Linux一个多线程的面试题
    进程的用户栈和内核栈
    Ubuntu 下安装LXR(linux源代码阅读工具)
    Linux多线程与同步
    实模式与保护模式
    Linux下的多线程编程
    寒假Day34:HTML表单+多媒体+框架
    寒假Day34:HDU1514Free Candies记忆化搜索
  • 原文地址:https://www.cnblogs.com/jsgnadsj/p/3457818.html
Copyright © 2020-2023  润新知