插入排序--《编程珠玑》
来源:互联网 发布:京东通信网络不能用 编辑:程序博客网 时间:2024/05/20 23:33
如百度百科:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置。
简而言之,就是将一个数据很好的插入已经有序的数列中,当然,依然是递增或是递减;
思想:首先第一个数据肯定是有序的,由第二个数据开始处理,进行插入排序:
以上述4个简单的数据为例,首先默认3是有序的,从第二个数据1开始,插入排序之后为1 3,接下来对第三个数据4进行排序...依次类推:
核心代码:
for(int i = 1; i < n; i++) { for(int j = i; j > 0 && a[j - 1] > a[j]; j--) swap(a[j - 1], a[j]); }若是对swap函数不习惯,写简单的交换也一样:
for(int i = 1; i < n; i++) { for(int j = i; j > 0 && a[j - 1] > a[j]; j--) { temp = a[j]; a[j] = a[j - 1]; a[j - 1] = temp; } }这时我们发现中间可能在进行一些无用的交换,比如上述最后一个2数据,先将2 4交换,后将2 3交换。其实我们将3 4向后移一位,再将2插入即可,如果数据大浪费的时间更多:
int j; for(int i = 1; i < n; i++) { temp = a[i]; for(j = i; j > 0 && a[j - 1] > a[j]; j--) a[j] = a[j - 1]; a[j] = temp; }作者说上述的时间各有不同,由于本人的数据过小,感觉不到:
顺序如上...完整代码:
#include <iostream>#include <algorithm>using namespace std;void sort(int a[], int n){ int temp; int j; for(int i = 1; i < n; i++) //sort3 { temp = a[i]; for(j = i; j > 0 && a[j - 1] > a[j]; j--) a[j] = a[j - 1]; a[j] = temp; } /*for(int i = 1; i < n; i++) //sort2 { for(int j = i; j > 0 && a[j - 1] > a[j]; j--) { temp = a[j]; a[j] = a[j - 1]; a[j - 1] = temp; } }*/ /*for(int i = 1; i < n; i++) //sort1 { for(int j = i; j > 0 && a[j - 1] > a[j]; j--) swap(a[j - 1], a[j]); }*/}void display(int a[], int n){ for(int i = 0; i < n; i++) cout << a[i] << " "; cout << endl;}int main(){ int a[] = {3, 1, 2, 4, 8, 9}; int n = sizeof(a) / sizeof(int); sort(a, n); display(a, n); return 0;}
O(∩_∩)O
3 0
- 插入排序--《编程珠玑》
- [编程珠玑读书笔记] 插入排序
- 三个版本的插入排序 - 编程珠玑
- 《编程珠玑2》读书笔记-插入排序
- 编程珠玑:第11章 排序 11.1 插入排序
- 编程珠玑:插入排序的最优探索,以及快排
- 编程珠玑: 电话号码排序
- 编程珠玑笔记--排序
- 【编程珠玑】位图排序
- 位图排序-《编程珠玑》
- 【编程珠玑】第十一章 排序 (插入排序和快速排序的深度优化)
- 插入排序和快速排序的优化——编程珠玑
- 《编程珠玑》第一章-位图排序
- 编程珠玑--位图法排序
- 编程珠玑--位图法排序
- [编程珠玑读书笔记]快速排序
- 编程珠玑 11章 排序
- 编程珠玑第十一章----排序
- java--get与post请求的区别
- SEO网络赢利
- 枫牛软件破解博客
- VS2010如何让两个或者多个项目共享同一个文件
- list_for_each_entry
- 插入排序--《编程珠玑》
- 提示磁盘被写保护怎么办?
- leetcode--Combination Sum
- 查看数据库事务默认级别
- DOM方式对xml文档的增删改查
- 数据库操作(SQLite)
- Codeforence 393A
- jdk 1.7中 ArrayList的容量增长方式
- 分享与自我表现