• 常用排序算法之--直接插入排序


    一直以来都是从博客园吸收营养,很想有机会写一些对博友们有用的文章,来回馈大家的无私奉献。最近博主在找工作,听小伙伴们说,数据结构与算法是必考项。于是痛下绝心决定写写排序算法。以备自查,同时与小伙伴们互勉。欢迎大家转载,如有错误,请指正。必感激不尽!

    学习交流qq:792911374,闲话不说,开始正文了。。。。。

    直接插入排序
    将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。如果碰到一个和插入元素相等的,那么插入元素把需要插入的元素放在相等的元素后面。相等元素的前后顺序没有改变,所以直接插入排序是稳定的排序算法。

    算法适用于少量数据的排序。时间复杂度为O(n^2), 空间复杂度为O(1)。

    算法为C语言代码,环境为qt。

     1 #include <QCoreApplication>
     2 
     3 //数组元素个数
     4 const int MAX = 10;
     5 //字符数组个数
     6 const int CHARNUM = 20;
     7 //信息结构体
     8 struct RecordInfo{
     9    int key;
    10    char name[20];
    11 };
    12 //数组元素的临时变量
    13 struct RecordInfo info[MAX];
    14 
    15 void genList();
    16 void insertSort();
    17 void printArray();
    18 
    19 int main(int argc, char *argv[])
    20 {
    21     //函数调用
    22     insertSort();
    23     printArray();
    24     QCoreApplication a(argc, argv);
    25     return a.exec();
    26 }
    27 
    28 /**
    29   * @函数名:
    30   * @参数:无
    31   * @返回值:无
    32   * @用途:生成内容数组
    33   * @作者:yangfy
    34   */
    35 void genList()
    36 {
    37     for(int i = 0; i < MAX; i++){
    38         if ((i % 3 == 0) && i > 0)
    39             info[i].key = info[i - 3].key;
    40         else
    41             info[i].key = rand();
    42         snprintf(info[i].name, CHARNUM - 1, "内容为第:%d个", i);
    43     }
    44 }
    45 
    46 /**
    47   * @函数名:
    48   * @参数:无
    49   * @返回值:无
    50   * @用途:直接插入排序
    51   * @作者:yangfy
    52   */
    53 void insertSort()
    54 {
    55     genList();
    56     struct RecordInfo recInfo;
    57     for(int i = 1; i < MAX; i++){
    58         for(int j = i; j > 0; j--){
    59             //在有序的数组列表中,从后往前找比j大的交换位置
    60             if(info[j].key < info[j - 1].key){
    61                 recInfo = info[j];
    62                 info[j] = info[j - 1];
    63                 info[j - 1] = recInfo;
    64             }
    65         }
    66     }
    67 }
    68 
    69 /**
    70   * @函数名:
    71   * @参数:无
    72   * @返回值:无
    73   * @用途:打印数组内容
    74   * @作者:yangfy
    75   */
    76 void printArray()
    77 {
    78     for(int i = 0; i < MAX; i++){
    79         printf("key为:%d, name为:%s
    ", info[i].key, info[i].name);
    80     }
    81 }

     程序截图:

  • 相关阅读:
    源代码的下载和编译
    Git使用入门
    搭建Android开发环境
    安卓系统移植与驱动开发概述
    第十章
    第九章
    第八章
    第七章读书笔记
    第六章读书笔记
    第五章读书笔记
  • 原文地址:https://www.cnblogs.com/scud001/p/4418092.html
Copyright © 2020-2023  润新知