插入排序

书上说的很好,用打牌作比方。就是一边是排好序的,剩下的是待排序的,每次取一个待排序的元素,找到按序的位置,插入已排好序的部分中。元素取完也就结束了。复杂度O(n^2)。

代码:

1 #include <iostream>
2  using namespace std;
3  #define LENGTH 11
4
5  void insert_sort(int array[],int len)
6 {
7 int i,j;
8
9 for (i=1;i<len;i++)
10 {
11 int key=array[i];
12 for (j=i-1;j>=0&&array[j]>key;j--)
13 {
14 array[j+1]=array[j];
15 }
16 array[j+1]=key;
17 }
18 }
19  int main()
20 {
21 int array[LENGTH]={9,3,5,12,7,34,56,28,16,4,10};
22 int i=0;
23
24 for (i=0;i<LENGTH;i++)
25 {
26 cout<<array[i]<<" ";
27 }
28 cout<<endl;
29
30 insert_sort(array,LENGTH);//sort
31  
32 for (i=0;i<LENGTH;i++)
33 {
34 cout<<array[i]<<" ";
35 }
36 cout<<endl;
37 }

合并排序

合并排序是一种分治法,实现上用了递归结构。过程是:先将待排序的元素分为两部分,一般是对等长度的两部分,称为左右L、R,先分别将L,R进行合并排序,然后将排序好的L、R合并在一起,则所有元素都有序。复杂度O(nlgn)。

代码

1 #include <iostream>
2  using namespace std;
3  #define LENGTH 10
4
5  void merge(int array[],int start,int middle,int end)
6 {
7 int i,j,k;
8 int n1=middle-start+1,n2=end-middle;
9 int *L=new int[n1+1],*R=new int[n2+1];
10
11 for (i=0;i<n1;i++)
12 {
13 L[i]=array[start+i];
14 }
15 for (i=0;i<n2;i++)
16 {
17 R[i]=array[middle+i+1];
18 }
19 L[n1]=INT_MAX;
20 R[n2]=INT_MAX;
21
22 i=0,j=0;
23 for (k=start;k<=end;k++)
24 {
25 if(L[i]<=R[j])
26 {
27 array[k]=L[i];
28 i++;
29 }
30 else
31 {
32 array[k]=R[j];
33 j++;
34 }
35 }
36 }
37
38  void merge_sort(int array[],int start,int end)
39 {
40 int i,j;
41 if(start<end)
42 {
43 int middle=(start+end)/2;
44 merge_sort(array,start,middle);
45 merge_sort(array,middle+1,end);
46 merge(array,start,middle,end);
47 }
48 }
49
50  int main()
51 {
52 int i=0;
53 int array[LENGTH]={9,12,5,24,8,7,15,10,0,22};
54 for (i=0;i<LENGTH;i++)
55 {
56 cout<<array[i]<<" ";
57 }
58 cout<<endl;
59
60 merge_sort(array,0,LENGTH-1);
61
62 for (i=0;i<LENGTH;i++)
63 {
64 cout<<array[i]<<" ";
65 }
66 cout<<endl;
67
68 return 0;
69 }

合并排序的扩展应用

对合并排序稍作一些改动,可以以O(nlgn)的复杂度实现其他功能。

思考题2.3.7

思路:

I  对集合S中的元素进行排序,选择复杂度为O(nlgn)的排序算法,这里是合并排序
II 从两头开始遍历排序后S的元素,下标分别为i、j,若S[i]+S[j]==x,返回;若S[i]+S[j]>x,j--;若S[i]+S[j]<x,i++

代码

1 #include <iostream>
2  using namespace std;
3  #define LENGTH 10
4
5  void merge(int array[],int start,int middle,int end)
6 {
7 int i,j,k;
8 int n1=middle-start+1,n2=end-middle;
9 int *L=new int[n1+1],*R=new int[n2+1];
10
11 for (i=0;i<n1;i++)
12 {
13 L[i]=array[start+i];
14 }
15 for (i=0;i<n2;i++)
16 {
17 R[i]=array[middle+i+1];
18 }
19 L[n1]=INT_MAX;
20 R[n2]=INT_MAX;
21
22 i=0,j=0;
23 for (k=start;k<=end;k++)
24 {
25 if(L[i]<=R[j])
26 {
27 array[k]=L[i];
28 i++;
29 }
30 else
31 {
32 array[k]=R[j];
33 j++;
34 }
35 }
36 }
37
38  void merge_sort(int array[],int start,int end)
39 {
40 int i,j;
41 if(start<end)
42 {
43 int middle=(start+end)/2;
44 merge_sort(array,start,middle);
45 merge_sort(array,middle+1,end);
46 merge(array,start,middle,end);
47 }
48 }
49
50  bool find_two_ele(int array[],int len,int x,int &x1,int &x2)
51 {
52 int i,j;
53 for (i=0,j=len-1;i<len;)
54 {
55 int sum=array[i]+array[j];
56 if(sum==x)
57 {
58 x1=array[i];
59 x2=array[j];
60 return true;
61 }
62 else
63 if(sum>x)
64 {
65 j--;
66 }
67 else
68 {
69 i++;
70 }
71 }
72 return false;
73 }
74  int main()
75 {
76 int i=0;
77 int array[LENGTH]={9,12,5,24,8,7,15,10,0,22};
78
79 merge_sort(array,0,LENGTH-1);
80
81 int x=15,x1,x2;
82
83 if(find_two_ele(array,LENGTH,x,x1,x2))
84 {
85 cout<<"Yes."<<x<<"="<<x1<<"+"<<x2<<endl;
86 }else
87 {
88 cout<<"No."<<endl;
89 }
90
91 return 0;
92 }

练习题2-4

逆序对问题,可以在合并的时候统计有多少逆序对。

代码

1 /****************
2 逆序对问题
3 ****************/
4 #include <iostream>
5  using namespace std;
6  #define LENGTH 10
7
8  int Num=0;
9
10  int merge(int array[],int start,int middle,int end)
11 {
12 int i,j,k,count=0;
13 int n1=middle-start+1,n2=end-middle;
14 int *L=new int[n1+1],*R=new int[n2+1];
15 for (i=0;i<n1;i++)
16 {
17 L[i]=array[start+i];
18 }
19 for (i=0;i<n2;i++)
20 {
21 R[i]=array[middle+i+1];
22 }
23 L[n1]=INT_MAX,R[n2]=INT_MAX;
24
25 i=0,j=0;
26 for (k=start;k<=end;k++)
27 {
28 if(L[i]<R[j])
29 {
30 array[k]=L[i];
31 i++;
32 }
33 else
34 {
35 array[k]=R[j];
36 count+=middle-start-i+1;//count
37   j++;
38 }
39 }
40
41 return count;
42 }
43
44  int merge_sort(int array[],int start,int end)
45 {
46 if(start<end)
47 {
48 int middle=(start+end)/2;
49 merge_sort(array,start,middle);
50 merge_sort(array,middle+1,end);
51 Num+=merge(array,start,middle,end);
52
53 return Num;
54 }
55 }
56
57  int main()
58 {
59 int array[LENGTH]={9,12,5,24,8,7,15,10,0,22};
60
61 cout<<merge_sort(array,0,LENGTH-1)<<endl;
62
63 for (int i=0;i<LENGTH;i++)
64 {
65 cout<<array[i]<<" ";
66 }
67 cout<<endl;
68
69 return 0;
70 }

转载于:https://www.cnblogs.com/njucslzh/archive/2010/09/01/1815160.html

《算法导论》(一)--插入排序与合并排序相关推荐

  1. C++结合插入排序和合并排序的算法(附完整源码)

    C++结合插入排序和合并排序的算法 C++结合插入排序和合并排序的算法完整源码(定义,实现,main函数测试) C++结合插入排序和合并排序的算法完整源码(定义,实现,main函数测试) #inclu ...

  2. 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)...

    写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...

  3. c++两个vector合并_数据结构——算法初步(4)——合并排序算法

    从之前的学习可以看到,对大型vectory要求的排序,选择排序算法显然不符合要求,因为运行时间与输入问题规模大小的平方成比例增加,对于以线性顺序处理向量的元素的大多数排序算法也是如此. 所以要采用不 ...

  4. 算法:分治法之合并排序

    合并排序算法思想: 先将无序序列利用二分法划分为子序列,直至每个子序列只有一个元素(单个元素就是有序),然后再对有序子序列两两进行合并排序. 合并方法是循环地将两个有序子序列当前的首元素进行比较,较小 ...

  5. 【算法导论】插入排序

    循环不变式 在数学上阐述了通过循环(迭代,递归)去计算一个累计的目标值的正确性. 关于循环不变式,我们必须要证明三条性质: 初始化:循环第一次迭代之前,它为真. 保持:如果循环的某次迭代之前它为真,那 ...

  6. 时间排序python_算法导论 第八章 线性时间排序(python)

    比较排序:各元素的次序依赖于它们之间的比较{插入排序O(n**2) 归并排序O(nlgn) 堆排序O(nlgn)快速排序O(n**2)平均O(nlgn)} 本章主要介绍几个线性时间排序:(运算排序非比 ...

  7. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  8. 分治算法:根号n段合并排序算法

    问题: 将数组 a[0,n-1]划分为 根号n 个子数组,每个子数组有 O(根号n)个元素.然后递归地对分割后的子数组进行排序,最后将所得到的根号n 个排好序的子数组合并排序. 工具与语言 我选择的为 ...

  9. java根号n元素的合并排序算法_分治算法:根号n段合并排序算法

    问题: 将数组 a[0,n-1]划分为 根号n 个子数组,每个子数组有 O(根号n)个元素.然后递归地对分割后的子数组进行排序,最后将所得到的根号n 个排好序的子数组合并排序. 工具与语言 我选择的为 ...

最新文章

  1. 微服务之配置中心ConfigKeeper
  2. JavaScript中的Try...Catch 语句
  3. 上交大计算机导师俞凯,WLA青科聊高考①|偶像剧“男主”、上海交大教授俞凯的学霸人生...
  4. python(matplotlib8)——图中图(在figure中画多个坐标图),次坐标(两个y轴)
  5. react把表格渲染好ui_react 入坑笔记(五) - 条件渲染和列表渲染
  6. 第三讲 关系映射反演原则
  7. 配置nfs环境的一些命令
  8. DP+BIT(优化复杂度) UESTC 1217 The Battle of Chibi
  9. YOLO V1,V2, V3的记录
  10. 【Objective-C】java中的interface与Objective-C中的interface的区别
  11. 【bzoj4355】Play with sequence 线段树区间最值操作
  12. bzoj 4289 TAX —— 点边转化
  13. NB-IoT使用笔记(5)在linux下用python搭建UDP转发服务器扩展NB可访问IP个数
  14. 嘉环科技IT管培生面试
  15. 抖音新手常犯的几个雷区,你知道几个?
  16. java网络编程(网络通信)
  17. 哪个配件最爱坏?电脑配件寿命浅谈
  18. X站全称是什么_工作中学习 | 没有校惯导之前为什么PFD不显示飞机姿态,而IFSD却能显示...
  19. 专业的个人记帐软件 爱上记帐 1.0.1
  20. 漫威电影里的这项技术竟然与大数据息息相关!

热门文章

  1. 英语和数学不好可以学python-学习Python总是学了新内容又忘了旧的咋办?
  2. python基本使用-python基本用法笔记合集
  3. python安装步骤win10-教你如何在Win10系统安装Python?
  4. python乘法口诀代码-浅析一句python代码成生九九乘法表
  5. r语言和python-r语言和python学哪个?
  6. python初学者视频-python从入门到精通视频(全60集)
  7. 零基础是学java还是python-零基础学编程java和python哪个好
  8. python菜鸟工具-终于清楚python菜鸟入门教程
  9. python手机版下载3.7.2-qpython手机版下载
  10. python三层装饰器-python 3层装饰器及应用场景