算法设计与分析线性时间选择

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

福州大学数学与计算机科学学院

《计算机算法设计与分析》上机实验报告(1)

专业和班级姓名

成绩学号

实验名称线性时间选择

实验目的和要求1. 理解算法设计的基本步骤和各步的主要内容,基本要求

2. 加深对递归设计方法基本思想的理解

实验任务1.掌握线性时间选择的基本算法及其应用

2. 利用线性时间选择算法找出数组的中位数

3. 分析实验结果,总结算法的时间和空间复杂度

实验步骤

1.线性时间选择的思想:

如果能在线性时间内找到一个划分基准使得按这个基准所划分出的2个子数组的长度都至少为原数组长度的ε倍(0<ε<1),那么就可以在最坏情况下用O(n)时间完成选择任务。例如,当ε=9/10,算法递归调用所产生的子数组的长度至少缩短1/10。所以,在最坏情况下,算法所需的计算时间T(n)满足递推式T(n)<=T(9n/10)+O(n)。由此可得T(n)=O(n)。

2.算法正确性证明

(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

3.#include

ing namespace std;

5.

6.template

7.void Swap(Type &x,Type &y);

8.

9.inline int Random(int x, int y);

10.

11.template

12.void BubbleSort(Type a[],int p,int r);

13.

14.template

15.int Partition(Type a[],int p,int r,Type x);

16.

17.template

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["<

32. }

33. cout<

34.

35. cout<<"第100小的元素是"<

36.

37.//重新排序,对比结果

38. BubbleSort(a,0,199);

39.

40.for(int i=0; i<200; i++)

41. {

42. cout<<"a["<

43. }

44. cout<

45.}

46.

47.template

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

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]

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

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]

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.

相关文档
最新文档