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
用第二种要浪费两次复制。
查看全文
相关阅读:
P6406 [COCI2014-2015] Norma 分治+数学
CF547D Mike and Fish 欧拉回路
P6628 [省选联考 2020 B 卷] 丁香之路 欧拉路+最小生成树
2020 CSP-S2 游记
CF594D REQ 树状数组+质因数分解
CF416E President's Path floyd
CF1385F Removing Leaves 拓扑排序
CF449C Jzzhu and Apples 思维题
回溯法与八皇后问题
codewars-7kyu:Sum of the first nth term of Series
原文地址:https://www.cnblogs.com/jjtx/p/2533471.html
最新文章
瓷砖铺放
数的划分
二级小知识
小知识
集合运算
行列式的几何应用
刚体的平面运动
幻方
算法训练 回文数
poj 1201 Intervals 差分约束系统
热门文章
P3435 [POI2006]OKR-Periods of Words KMP算法
二维ST表
P2325 [SCOI2005]王室联邦 树分块
P6242 【模板】线段树 3 线段树维护历史最值+区间取min
Loj 2980. 「THUSCH 2017」大魔法师 线段树维护矩阵
线性筛各种函数
bzoj 4804. 欧拉心算 莫比乌斯反演
P6810 「MCOI-02」Convex Hull 凸包 莫比乌斯反演
CF1442C Graph Transpositions 01BFS
P6820 [PA2012]Two Cakes DP状态优化
Copyright © 2011-2022 走看看