算法设计与分析-线性时间选择
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
福州大学数学与计算机科学学院
《计算机算法设计与分析》上机实验报告(1)
(1)将所有的数n个以每5个划分为一组共组,将不足5个的那组忽略,然后用任意一种排序算法,因为只对5个数进行排序,所以任取一种排序法就可以了。
将每组中的元素排好序再分别取每组的中位数,得到个中位数。
(2)取这个中位数的中位数,如果是偶数,就找它的2个中位数中较大的一个作为划分基准。
(3)将全部的数划分为两个部分,小于基准的在左边,大于等于基准的放右边。
在这种情况下找出的基准x至少比个元素大。
因为在每一组中有2个元素小于本组的中位数,有个小于基准,中位数处于,即个中位数中又有
个小于基准x。
因此至少有
个元素小于基准x。
同理基准x也至少比个元素小。
而当n≥75时
≥n/4所以按此基准划分所得的2个子数组的长度都至少缩短1/4。
通过上述说明可以证明将原问题分解为两个子问题进行求解能够更加节省求解时间。
3.查找中位数程序代码
1.#include "stdafx.h"
2.#include <ctime>
3.#include <iostream>
ing namespace std;
5.
6.template <class Type>
7.void Swap(Type &x,Type &y);
8.
9.inline int Random(int x, int y);
10.
11.template <class Type>
12.void BubbleSort(Type a[],int p,int r);
13.
14.template <class Type>
15.int Partition(Type a[],int p,int r,Type x);
16.
17.template <class Type>
18.Type Select(Type a[],int p,int r,int k);
19.
20.int main()
21.{
22.//初始化数组
23.int a[200];
24.
25.//必须放在循环体外面
26. srand((unsigned)time(0));
27.
28.for(int i=0; i<200; i++)
29. {
30. a[i] = Random(0,500);
31. cout<<"a["<<i<<"]:"<<a[i]<<" ";
32. }
33. cout<<endl;
34.
35. cout<<"第100小的元素是"<<Select(a,0,199,100)<<endl;
36.
37.//重新排序,对比结果
38. BubbleSort(a,0,199);
39.
40.for(int i=0; i<200; i++)
41. {
42. cout<<"a["<<i<<"]:"<<a[i]<<" ";
43. }
44. cout<<endl;
45.}
46.
47.template <class Type>
48.void Swap(Type &x,Type &y)
49.{
50. Type temp = x;
51. x = y;
52. y = temp;
53.}
54.
55.inline int Random(int x, int y)
56.{
57.int ran_num = rand() % (y - x) + x;
58.return ran_num;
59.}
60.
61.//冒泡排序
62.template <class Type>
63.void BubbleSort(Type a[],int p,int r)
64.{
65.//记录一次遍历中是否有元素的交换
66.bool exchange;
67.for(int i=p; i<=r-1;i++)
68. {
69. exchange = false ;
70.for(int j=i+1; j<=r; j++)
71. {
72.if(a[j]<a[j-1])
73. {
74. Swap(a[j],a[j-1]);
75. exchange = true;
76. }
77. }
78.//如果这次遍历没有元素的交换,那么排序结束
79.if(false == exchange)
80. {
81.break ;
82. }
83. }
84.}
85.
86.template <class Type>
87.int Partition(Type a[],int p,int r,Type x)
88.{
89.int i = p-1,j = r + 1;
90.
91.while(true)
92. {
93.while(a[++i]<x && i<r);
94.while(a[--j]>x);
95.if(i>=j)
96. {
97.break;
98. }
99. Swap(a[i],a[j]);
100. }
101.return j;
102.}
103.
104.
105.template <class Type>
106.Type Select(Type a[],int p,int r,int k)
107.{
108.if(r-p<75)
109. {
110. BubbleSort(a,p,r);
111.return a[p+k-1];
112. }
113.//(r-p-4)/5相当于n-5
114.for(int i=0; i<=(r-p-4)/5; i++)
115. {
116.//将元素每5个分成一组,分别排序,并将该组中位数与a[p+i]交换位置
117.//使所有中位数都排列在数组最左侧,以便进一步查找中位数的中位数
118. BubbleSort(a,p+5*i,p+5*i+4);
119. Swap(a[p+5*i+2],a[p+i]);
120. }
121.//找中位数的中位数
122. Type x = Select(a,p,p+(r-p-4)/5,(r-p-4)/10);
123.int i = Partition(a,p,r,x);
124.int j = i-p+1;
125.if(k<=j)
126. {
127.return Select(a,p,i,k);
128. }
129.else
130. {
1.实验结果说明(找中位数结果截图)
实验结果
2.实验结果分析
通过上面的结果图可以看出程序能够快速生成一个无
序数组并找到第K小的元素。