runxinzhi.com
首页
百度搜索
插入排序之直接插入排序
直接插入排序
时间复杂度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
用第二种要浪费两次复制。
相关阅读:
几个数之和----数组刷题
单调栈刷题
腾讯金融科技凉经
mysql刷题
链表类题目常用方法
阿里云一面凉经
腾讯TEG一面凉经
腾讯软件开发-后台开发实习生-一面凉经
剑指 Offer 19. 正则表达式匹配
剑指 Offer 20. 表示数值的字符串
原文地址:https://www.cnblogs.com/jjtx/p/2533471.html
最新文章
发电厂励磁系统的组成、分类、功能
发电机过激磁(过励磁)保护原理及动作处理步骤
发电机主保护及后备保护有哪些?各自的作用?
RCX-9290D低压防孤岛装置功能、技术参数、厂家
RCX-9390D防孤岛保护装置功能、价格、厂家
公用测控屏的功能,作用、组成、价格
发电机负序过电流保护动作原因及处理方案
母联合环保护测控装置
发电机保护有哪些、配置标准
发电机应装哪些保护?它们的作用是什么?
热门文章
VS 快捷键
sql server 删除所有表、视图、存储过程
数据库SQL
webapi+iis
存储过程基本使用
VS如何根据数据库生成实体类
移动端上传图片前端压缩,获取input type=file路径
table中使用collapse消除重复的边框问题
一个简单的表单
EF中的事务处理
Copyright © 2020-2023
润新知