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
用第二种要浪费两次复制。
查看全文
相关阅读:
安装MSSQL2008出现的问题记录
制作安装包遇到的问题
算法设计方法动态规划
基础果然要牢记(一次失败的电面)
搜狗垂搜笔试
几种堆的时间复杂度分析
正则表达式转NFA
组合数学(1)
算法设计方法贪心算法
最短路径问题
原文地址:https://www.cnblogs.com/jjtx/p/2533471.html
最新文章
Linux常用命令06 ps
Linux常用命令04 ls
Linux常用命令03 grep
Linux常用命令07 rm
Linux常用命令05 文本追加到文件中
保险企业中商业智能技术的应用 (转载)
数据挖掘主要侧重解决的4类问题 (转载)
oracle分析函数(一)
Linux Crontab 定时任务
oracle数据库表部分字段双向同步,利用包和触发器实现(转载)
热门文章
15款经典图表软件推荐 创建最漂亮的图表(转载)
oracle数据类型
网页实现缓存
清理缓冲区的方法
如何让网站被快速收录?
MSSQL错误对照表
如何快速有效的分析关键词
SEO一般有哪些步骤或环节?
从各个分类中各取出前N个记录
简单查询树形结构数据库表
Copyright © 2011-2022 走看看