zoukankan
html css js c++ java
插入排序之直接插入排序
直接插入排序
时间复杂度O(n^2)
附加空间O(1)
稳定排序
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #define LEN 8 // 有LEN个元素要排 struct Record { // 为了考察排序的稳定性,定义元素是结构体类型 int key; int otherinfo; }; void InsertSort(Record *arr, int length) // length是要排序的元素的个数,0号单元除外 { for (int i = 2; i <= length; i++) { if (arr[i - 1].key > arr[i].key) { // 若判断时改为>=,则是不稳定排序,下同 arr[0] = arr[i]; arr[i] = arr[i - 1]; int j; for (j = i - 2; arr[j].key > arr[0].key; j--) arr[j + 1] = arr[j]; arr[j + 1] = arr[0]; } } } int main(void) { freopen("in.txt", "r", stdin); Record a[LEN + 1] = {0}; for (int i = 1; i <= LEN; i++) cin >> a[i].key >> a[i].otherinfo; InsertSort(a, LEN); for (int i = 1; i <= LEN; i++) cout << a[i].key << '\t' << a[i].otherinfo << endl; return 0; } /* in.txt: 49 1 38 0 65 0 97 0 76 0 13 0 27 0 49 2 out: 13 0 27 0 38 0 49 1 49 2 65 0 76 0 97 0 */
若排序的函数写成下面这样:
void InsertSort(Record *arr, int length) // length是要排序的元素的个数,0号单元除外 { for (int i = 2; i <= length; i++) { arr[0] = arr[i]; // 当当前比较的元素比前一个大时(前面的都已排好序),可直接continue,以免复制去又复制来 int j; for (j = i - 1; arr[j].key > arr[0].key; j--) arr[j + 1] = arr[j]; arr[j + 1] = arr[0]; } }
代码是简洁了些,但有些微妙的缺陷,如注释所示。
比如排
12 27
用第二种要浪费两次复制。
查看全文
相关阅读:
好用的抓取dump的工具-ProcDump
好用的抓取dump的工具-ProcDump
使用Windbg调试系统弹出的内存不可读错误
使用Windbg调试系统弹出的内存不可读错误
驱动层hook系统函数的时,如何屏蔽掉只读属性?
Rootkit之SSDT hook(通过CR0)
Rootkit之SSDT hook(通过CR0)
#define SYSTEMSERVICE(_func) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_func+1) 这
华南理工大学“三七互娱杯”程序设计竞赛(重现赛)B HRY and fibonacci
华南理工大学“三七互娱杯”程序设计竞赛(重现赛)A HRY and codefire
原文地址:https://www.cnblogs.com/jjtx/p/2533471.html
最新文章
MFC 下拉框Combo Box
MFC 可编辑文本框,MFC控件关联变量总结
MFC 静态文本框
OpenCV图像特征——角点检测(Corner Detection)
MFC 模态对话框、非模态对话框
MFC GDI绘图
MFC的静态链接、动态链接
2、创建MFC应用程序——基于对话框,时间计时器
哈希表的C实现(二)
哈希表的C实现(一)
热门文章
嵌入式Linux学习方法——给那些彷徨者(下)
嵌入式Linux学习方法——给那些彷徨者(上)
Win7笔记本电脑启用虚拟WIFI共享上网
分享Ubuntu下一些很棒的软件(一)
你刚才在淘宝上买了一件东西
分享几篇文章(PDF版)
sizeof()解析(原)
机器学习相关——协同过滤
Windbg 调试CPU占用过高
Windbg 调试CPU占用过高
Copyright © 2011-2022 走看看