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

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

学习交流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 }

 程序截图:

原文地址:https://www.cnblogs.com/scud001/p/4418092.html