插入排序之直接插入排序
来源:互联网 发布:数据库的应用领域 编辑:程序博客网 时间:2024/04/28 06:08
直接插入排序
时间复杂度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 138 065 097 076 013 027 049 2out:13 027 038 049 149 265 076 097 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];}}代码是简洁了些,但有些微妙的缺陷,如注释所示。
比如排
1227
用第二种要浪费两次复制。
- 插入排序之直接插入
- 排序之直接插入排序
- 排序之直接插入排序
- 排序之直接插入排序
- 排序之直接插入排序
- 排序之直接插入排序
- 排序之直接插入排序
- 排序之直接插入排序
- 排序之直接插入排序
- 排序之直接插入排序
- 插入排序之直接插入排序
- 插入排序之----直接插入排序
- 插入排序之直接插入排序
- java插入排序之直接插入排序
- 插入排序之直接插入排序
- 插入排序之直接插入排序
- 插入排序之直接插入排序
- 插入排序之直接插入排序
- VOIP通信原理简洁描述
- 赛马问题
- Struts2 Action多方法调用
- C# winform 开发之Excel操作(一)------打开Exce表
- getaddrinfo( ) - getnameinfo( )/ inet_ntop( )
- 插入排序之直接插入排序
- train2(H1023)
- 语音传输协议中的单向端到端延迟时间
- 无尽思念
- voip中的压缩解码
- C++中继承情况下的类作用域
- 书单
- Struts2 Action与ServletAPI的解耦、耦合
- Android Service 通知Activity更新界面的方法