一直以来都是从博客园吸收营养,很想有机会写一些对博友们有用的文章,来回馈大家的无私奉献。最近博主在找工作,听小伙伴们说,数据结构与算法是必考项。于是痛下绝心决定写写排序算法。以备自查,同时与小伙伴们互勉。欢迎大家转载,如有错误,请指正。必感激不尽!
学习交流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\r\n", info[i].key, info[i].name); 80 } 81 }
程序截图: