武汉理工数据结构排序算法比较实验报告

武汉理工数据结构排序算法比较实验报告
武汉理工数据结构排序算法比较实验报告

学生学号实验课成绩

武汉理工大学

学生实验报告书

实验课程名称数据结构与算法

开课学院计算机科学与技术学院指导教师姓名

学生姓名

学生专业班级计算机类

2017 —2018 学年第一学期

实验课程名称:高级语言程序设计

实验项目名称内部排序算法比较实验成绩

实验者专业班级组别

同组者实验日期年月日第一部分:实验分析与设计(可加页)

一、实验内容描述(问题域描述)

内部排序算法比较。编制一个演示内部排序算法比较的程序。对起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序算法进行比较。

二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或

者算法描述)

(1)伪随机产生数据:用伪随机产生程序产生一组随机数,再用不同排序算法进行排

序。

(2)简单选择排序:运用简单选择排序法对伪随机产生的数据进行排序。

(3) 起泡排序:运用起泡排序法对伪随机产生的数据进行排序。

(4)直接插入排序:运用直接插入排序法对伪随机产生的数据进行排序。

(5)希尔排序:运用希尔排序法对伪随机产生的数据进行排序。

(6)快速排序:运用快速排序法对伪随机产生的数据进行排序。

(7)归并排序:运用归并排序法对伪随机产生的数据进行排序。

定义抽象数据类型

typedef struct

{

int key;

}ElemType; //关键字

typedef struct

{

ElemType *elem;

int length;

}SqList;//本实验使用线性表的存储结构

三、主要仪器设备及耗材

PC

Dev-C++ 5.11

Sublime Text 3 编辑器

第二部分:实验调试与结果分析(可加页)

一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)

二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)

实验结果只有在待排序个数数目比较大的时候才能体现更明显的区别。实验运行成功,整体符合预期。

简单选择排序:运用顺序表。时间复杂度O(n2),空间复杂度O(1)。

起泡排序:时间复杂度O(n2),空间复杂度O(1)

直接插入排序:时间复杂度O(n2),空间复杂度O(1)

希尔排序:时间复杂度O(n1.3),空间复杂度O(1)

快速排序:时间复杂度O(nlog2n),空间复杂度O(nlog2n)

归并排序:时间复杂度O(nlog2n),空间复杂度O(n)

三、实验小结、建议及体会

深入学习理解各种排序方法的性能差别:

排序算法的性能评估

稳定性(假设记录 a 和记录 b 都位于待排序的序列中)

(1)稳定:如果 a 本来就在 b 前面,且 a = b,排序之后 a 仍然在 b 前面;

(2)不稳定:如果 a 本来就在 b 前面,且 a = b,排序之后 a 可能出现在 b 后面;

待排序的记录是否全部被放置在内存中

(1)内排序:在整个排序过程中,待排序的所有记录全部被放置在内存中;(文中的所有排序算法都属于内排序)

(2)外排序:由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行;

时间复杂度:排序算法的时间开销

空间复杂度:排序算法所需的存储空间

算法本身的复杂度。

从平均情况来看,堆排序,归并排序和快速排序算法要胜过希尔排序,并远远超过冒泡,选择

和插入排序的三种简单算法;

从最好情况来看,冒泡和插入排序算法要比其他算法更胜一筹,也就是说如果待排序的序列基本有序,则可以选择这两种排序算法;

从最坏情况来看,堆排序和归并排序要由于快速排序以及其他简单排序;

从空间复杂度来看,除了归并排序和快速排序之外,其余算法对辅助空间的要求一致,都是O(1);如果排序过程中,对空间复杂度有要求,则不建议选择归并排序和快速排序。

从稳定性来看,改进算法中,只有归并排序是稳定的,而简单排序都是稳定的;

从待排序的记录的个数看,如果待排序的个数 n 越小,则采用简单排序算法比较合适;如果待排序的个数 n 越大,则采用改进排序算法更合适。

四、附件:实验代码

1)#include

2)#include

3)#include

4)#include

5)#include

6)#define LIST_INIT_SIZE 30000

7)int bj1,yd1,n,com,mov;

8)long int A[5],B[5];

9)double t0,t1,t2,t3,t4,t5,C[5];

10)clock_t start_t,end_t;

11)typedef struct

12){

13) int key;

14)}ElemType;

15)typedef struct

16){

17) ElemType *elem;

18) int length;

19)}SqList;

20)void addlist(SqList &L)

21){

22) int i;

23)a: printf("请输入你要输入的个数:");

24) scanf("%d",&n);

25) if(n>20000)

26) {

27) printf("超出范围重新输入!!!\n");

28) goto a;

29) }

30) L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));

31) if(!L.elem)exit(0);

32) L.length=0;

33) for(i=1;i

34) {

35)b: L.elem[i].key=rand();

36) if(L.elem[i].key>20000)goto b;

37) ++L.length;

38) }

39)}

40)void SelectSort(SqList &L) //简单选择排序

41){

42) start_t=clock();

43) int i,j,k,com=0,mov=0;

44) for(i=1;i

45) {

46) k=i;

47) for(j=i+1;j

48) {

49) com++;

50) if(L.elem[j].key

51) }

52) if(i!=k)

53) {

54) L.elem[0].key=L.elem[i].key;

55) L.elem[i].key=L.elem[k].key;

56) L.elem[k].key=L.elem[0].key;

57) mov+=3;

58) }

59) }

60) end_t=clock();

61) printf("比较次数为 %d移动次数为 %d\n",com,mov);

62) t0=(double)(end_t-start_t)/CLK_TCK;

63) printf("排序用时为 %f\n",t0);

64) A[0]=com;

65) B[0]=mov;

66) C[0]=t0;

67)}

68)void bubblesort(SqList &L) //起泡排序

69){

70) start_t=clock();

71) int i=1,j,com=0,mov=0;

72) while(i

73) {

74) for(j=1;j

75) {

76) com++;

77) if(L.elem[j].key>L.elem[j+1].key)

78) {

79) L.elem[0].key=L.elem[j].key;

80) L.elem[j].key=L.elem[j+1].key;

81) L.elem[j+1].key=L.elem[0].key;

82) mov+=3;

83) }

84) }

85) i++;

86) }

87) end_t=clock();

88) printf("比较次数为 %d移动次数为 %d\n",com,mov);

89) t1=(double)(end_t-start_t)/CLK_TCK;

90) printf("排序用时为 %f\n",t1);

91) A[1]=com;

92) B[1]=mov;

93) C[1]=t1;

94)}

95)void InsertSort(SqList &L) //直接插入排序

96){

97) start_t=clock();

98) int i,j,com=0,mov=0;

99) for(i=2;i<=L.length;i++)

100) {

101) if(L.elem[i].key

102) {

103) L.elem[0].key=L.elem[i].key;

104) mov++;

105) j=i-1;

106) com++;

107) while(L.elem[0].key

108) {

109) L.elem[j+1].key=L.elem[j].key;

110) j--;

111) mov++;

112) com++;

113) }

114) L.elem[j+1].key=L.elem[0].key;

115) mov++;

116) }

117) }

118) end_t=clock();

119) printf("比较次数为 %d移动次数为 %d\n",com,mov); 120) t2=(double)(end_t-start_t)/CLK_TCK;

121) printf("排序用时为 %f\n",t2);

122) A[2]=com;

123) B[2]=mov;

124) C[2]=t2;

125)}

126)void xier(SqList &L) //希尔排序

127){

128) start_t=clock();

129) int i,d=L.length/2,j,w=0,k,com=0,mov=0;

130) while(w

131) {

132) w=1;

133) for(i=w;i

134) {

135) k=i;

136) for(j=i+d;j

137) {

138) if(L.elem[i].key>L.elem[j].key)

139) {

140) k=j;

141) com++;

142) }

143) }

144) if(i!=k)

145) {

146) L.elem[0].key=L.elem[i].key;

147) L.elem[i].key=L.elem[k].key;

148) L.elem[k].key=L.elem[0].key;

149) mov+=3;

150) }

151) w++;

152) }

153) d=d/2;

154) w=1;

155) }

156) end_t=clock();

157) printf("比较次数为 %d移动次数为 %d\n",com,mov); 158) t3=(double)(end_t-start_t)/CLK_TCK;

159) printf("排序用时为 %f\n",t3);

160) A[3]=com;

161) B[3]=mov;

162) C[3]=t3;

163)}

164)void BeforeSort()

165){

166) yd1=0,bj1=0;

167)}

168)void display(int m,int n)

169){

170) printf("比较次数为 %d移动次数为 %d\n",m,n); 171)}

172)int Partition(SqList L,int low,int high) //快速排序173){

174) int pivotkey;

175) L.elem[0]=L.elem[low];

176) yd1++;

177) pivotkey=L.elem[low].key;

178) while (low

179) {

180) yd1++;

181) while(low=pivotkey)

182) {

183)--high;

184) L.elem[low]=L.elem[high];

185) bj1++;

186) yd1++;

187)}

188) while (low

189) {

190)++low;

191) L.elem[high]=L.elem[low];

192) bj1++;

193) yd1++;

194)}

195) }

196) L.elem[low]=L.elem[0];

197) yd1++;

198) return low;

199)}

200)void QSort(SqList &L,int low,int high)

201){

202) int pivotloc;

203) if(low

204) {

205) pivotloc=Partition(L,low,high);

206) QSort(L,low,pivotloc-1);

207) QSort(L,pivotloc+1,high);

208) }

209)}

210)void QuickSort(SqList &L)

211){

212) start_t=clock();

213) BeforeSort();

214) QSort(L,1,L.length);

215) display(bj1,yd1);

216) end_t=clock();

217) t4=(double)(end_t-start_t)/CLK_TCK;

218) printf("排序用时为 %f\n",t4);

219) A[4]=bj1;

220) B[4]=yd1;

221) C[4]=t4;

222)}

223)void Merge(ElemType R[],ElemType R1[],int low,int m,int high) //归并排序

224){

225) int i=low, j=m+1, k=low;

226) while(i<=m&&j<=high)

227) {

228) if(R[i].key<=R[j].key)

229) {

230) bj1++;

231) R1[k]=R[i];

232) yd1++;

233) i++;

234) k++;

235) }

236) else

237) {

238) bj1++;

239) R1[k]=R[j];

240) yd1++;

241) j++;

242) k++;

243) }

244) }

245) while(i<=m)

246) {

247) R1[k]=R[i];

248) yd1++;

249) i++;

250) k++;

251) }

252) while(j<=high)

253) {

254) R1[k]=R[j];

255) yd1++;

256) j++;

257) k++;

258) }

259)}

260)void MergePass(ElemType R[],ElemType R1[],int length, int n) 261){

262) int i=0,j;

263) while(i+2*length-1

264) {

265) Merge(R,R1,i,i+length-1,i+2*length-1);

266) i=i+2*length;

267) }

268) if(i+length-1

269) Merge(R,R1,i,i+length-1,n-1);

270) else

271) for(j=i;j

272) R1[j]=R[j];

273)}

274)void MSort(ElemType R[],ElemType R1[],int n) 275){

276) int length=1;

277) while (length

278) {

279) MergePass(R,R1,length,n);

280) length=2*length;

281) MergePass(R1,R,length,n);

282) length=2*length;

283) }

284)}

285)void MergeSort(SqList &L)

286){

287) start_t=clock();

288) BeforeSort();

289) MSort(L.elem,L.elem,L.length);

290) display(bj1,yd1);

291) end_t=clock();

292) t5=(double)(end_t-start_t)/CLK_TCK;

293) printf("排序用时为 %f\n",t5);

294) A[5]=bj1;

295) B[5]=yd1;

296) C[5]=t5;

297)}

298)void printf(SqList &L)

299){

300)long int d[6];

301)int i,n;

302)printf("\n**********比较次数*********\n"); 303)printf("\n*******************\n");

304)for(i=0;i<5;i++)

305) d[i]= sqrt (A[i]/A[5]);

306) printf("\n 归并排序: *");

307)printf("\n*******************\n"); 308) printf(" 选择排序: ");

309) for(n=0,i=0;n<=d[i];n++)

310) {

311) printf("*");

312) }

313) printf("\n*******************\n");

314) printf(" 冒泡排序: ");

315) for(n=0,i=1;n<=d[i];n++)

316) {

317) printf("*");

319) printf("\n*******************\n");

320) printf(" 直插排序: ");

321) for(n=0,i=2;n<=d[i];n++)

322) {

323) printf("*");

324) }

325) printf("\n*******************\n");

326) printf(" 希尔排序: ");

327) for(n=0,i=3;n<=d[i];n++)

328) {

329) printf("*");

330) }

331) printf("\n*******************\n");

332) printf(" 快排排序: ");

333) for(n=0,i=4;n<=d[i];n++)

334) {

335) printf("*");

336) }

337) printf("\n*******************\n");

338) printf("\n★★★★★★移动次数★★★★★★\n"); 339) printf("\n*******************\n");

340) double e[6];

341) for(i=0;i<6;i++)

342) e[i]= sqrt (B[i]/B[3]);

343) printf("\n 希尔排序: *");

344) printf("\n*******************\n");

345) printf(" 选择排序: ");

346) for(n=0,i=0;n<=e[i];n++)

347) {

348) printf("*");

349) }

350) printf("\n*******************\n");

351) printf(" 冒泡排序: ");

352) for(n=0,i=1;n<=e[i];n++)

353) {

354) printf("*");

355) }

356) printf("\n*******************\n");

357) printf(" 直插排序: ");

358) for(n=0,i=2;n<=e[i];n++)

359) {

360) printf("*");

361) }

362) printf("\n*******************\n");

363) printf(" 快排排序: ");

364) for(n=0,i=4;n<=e[i];n++)

366) printf("*");

367) }

368) printf("\n*******************\n");

369)printf(" 归并排序: ");

370) for(n=0,i=5;n<=e[i];n++)

371) {

372) printf("*");

373) }

374) printf("\n*******************\n");

375) printf("\n★★★★★★排序用时★★★★★★\n"); 376) printf("\n*******************\n");

377) double f[6];

378) for(i=0;i<6;i++)

379) f[i]= sqrt (C[i]/0.001);

380) printf("\n 希尔排序: *");

381) printf("\n*******************\n");

382) printf(" 选择排序: ");

383) for(n=0,i=0;n<=f[i];n++)

384) {

385) printf("*");

386) }

387) printf("\n*******************\n");

388) printf(" 冒泡排序: ");

389) for(n=0,i=1;n<=f[i];n++)

390) {

391) printf("*");

392) }

393) printf("\n*******************\n");

394) printf(" 直插排序: ");

395) for(n=0,i=2;n<=f[i];n++)

396) {

397) printf("*");

398) }

399) printf("\n*******************\n");

400) printf(" 快排排序: ");

401) for(n=0,i=4;n<=f[i];n++)

402) {

403) printf("*");

404) }

405) printf("\n*******************\n");

406) printf(" 归并排序: ");

407) for(n=0,i=5;n<=f[i];n++)

408) {

409) printf("*");

410) }

411) printf("\n*******************\n");

412)}

413)int main()

414){

415) SqList L;

416) addlist(L);

417) printf("\n选择排序: \n"); 418) SelectSort(L);

419) addlist(L);

420) printf("\n起泡排序: \n"); 421) bubblesort(L);

422) addlist(L);

423) printf("\n直插排序: \n"); 424) InsertSort(L);

425)addlist(L);

426) printf("\n希尔排序: \n"); 427) xier(L);

428) addlist(L);

429) printf("\n快速排续: \n"); 430) QuickSort(L);

431) addlist(L);

432) printf("\n归并排序: \n"); 433) MergeSort(L);

434) printf(L);

435)}

插入排序算法实验报告

算法设计与分析基础 实验报告 应用数学学院 二零一六年六月

实验一插入排序算法 一、实验性质设计 二、实验学时14学时 三、实验目的 1、掌握插入排序的方法和原理。 2、掌握java语言实现该算法的一般流程。 四、实验内容 1、数组的输入。 2、输入、输出的异常处理。 3、插入排序的算法流程。 4、运行结果的输出。 五、实验报告 Ⅰ、算法原理 从左到右扫描有序的子数组,直到遇到一个大于(或小于)等于A[n-1]的元素,然后就把A[n-1]插在该元素的前面(或后面)。 插入排序基于递归思想。 Ⅱ、书中源代码 算法InsertionSort(A[0..n-1]) //用插入排序对给定数组A[0..n-1]排序 //输入:n个可排序元素构成的一个数组A[0..n-1] //输出:非降序排列的数组A[0..n-1] for i ←1 to n-1 do v ← A[i] j ← i-1 while j ≥0and A[j] > v do A[j+1] ← A[j] j ← j-1 A[j+1] ← v

Ⅲ、Java算法代码: import java.util.*; public class Charu { public static void main(String[] args) { int n = 5; int a[] = new int[n]; int s = a.length; int i = 0, j = 0, v = 0; System.out.println("请输入若干个数字:"); Scanner sc = new Scanner(System.in); try { while (i < s) { a[i] = sc.nextInt(); i++; } for (i = 1; i = 0 && a[j] > v) { a[j + 1] = a[j]; j--; } a[j + 1] = v; } System.out.println("插入排序结果显示:"); for (i = 0; i < s; i++) { System.out.println(a[i]); } } catch (Exception es) { System.out.println(es); } } } Ⅳ、运行结果显示:

《数据结构》实验报告——排序.docx

《数据结构》实验报告排序实验题目: 输入十个数,从插入排序,快速排序,选择排序三类算法中各选一种编程实现。 实验所使用的数据结构内容及编程思路: 1. 插入排序:直接插入排序的基本操作是,将一个记录到已排好序的有序表中,从而得到一个新的,记录增一得有序表。 一般情况下,第i 趟直接插入排序的操作为:在含有i-1 个记录的有序子序列r[1..i-1 ]中插入一个记录r[i ]后,变成含有i 个记录的有序子序列r[1..i ];并且,和顺序查找类似,为了在查找插入位置的过程中避免数组下标出界,在r [0]处设置哨兵。在自i-1 起往前搜索的过程中,可以同时后移记录。整个排序过程为进行n-1 趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第2 个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。 2. 快速排序:基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序的序列为{L.r[s] ,L.r[s+1],…L.r[t]}, 首先任意选取一个记录 (通常可选第一个记录L.r[s])作为枢轴(或支点)(PiVOt ),然后按下述原则重新排列其余记录:将所有关键字较它小的记录都安置在它的位置之前,将所有关键字较大的记录都安置在它的位置之后。由此可以该“枢轴”记录最后所罗的位置i 作为界线,将序列{L.r[s] ,… ,L.r[t]} 分割成两个子序列{L.r[i+1],L.[i+2], …,L.r[t]}。这个过程称为一趟快速排序,或一次划分。 一趟快速排序的具体做法是:附设两个指针lOw 和high ,他们的初值分别为lOw 和high ,设枢轴记录的关键字为PiVOtkey ,则首先从high 所指位置起向前搜索找到第一个关键字小于PiVOtkey 的记录和枢轴记录互相交换,然后从lOw 所指位置起向后搜索,找到第一个关键字大于PiVOtkey 的记录和枢轴记录互相 交换,重复这两不直至low=high 为止。 具体实现上述算法是,每交换一对记录需进行3 次记录移动(赋值)的操作。而实际上,

排序操作实验报告

数据结构与算法设计 实验报告 (2016 — 2017 学年第1 学期) 实验名称: 年级: 专业: 班级: 学号: 姓名: 指导教师: 成都信息工程大学通信工程学院

一、实验目的 验证各种简单的排序算法。在调试中体会排序过程。 二、实验要求 (1)从键盘读入一组无序数据,按输入顺序先创建一个线性表。 (2)用带菜单的主函数任意选择一种排序算法将该表进行递增排序,并显示出每一趟排序过程。 三、实验步骤 1、创建工程(附带截图说明) 2、根据算法编写程序(参见第六部分源代码) 3、编译 4、调试 四、实验结果图 图1-直接输入排序

图2-冒泡排序 图3-直接选择排序 五、心得体会 与哈希表的操作实验相比,本次实验遇到的问题较大。由于此次实验中设计了三种排序方法导致我在设计算法时混淆了一些概念,设计思路特别混乱。虽然在理清思路后成功解决了直接输入和直接选择两种算法,但冒泡

排序的算法仍未设计成功。虽然在老师和同学的帮助下完成了冒泡排序的算法,但还需要多练习这方面的习题,平时也应多思考这方面的问题。而且,在直接输入和直接选择的算法设计上也有较为复杂的地方,对照书本做了精简纠正。 本次实验让我发现自己在算法设计上存在一些思虑不周的地方,思考问题过于片面,逻辑思维能力太过单薄,还需要继续练习。 六、源代码 要求:粘贴个人代码,以便检查。 #include #define MAXSIZE 100 typedef int KeyType; typedef int DataType; typedef struct{ KeyType key; DataType data; }SortItem,SqList[MAXSIZE]; /*******直接插入顺序表*******/ void InsertSort(SqList L,int n) { int i,j,x; SortItem p; for(i=1;i

算法排序问题实验报告

《排序问题求解》实验报告 一、算法的基本思想 1、直接插入排序算法思想 直接插入排序的基本思想是将一个记录插入到已排好序的序列中,从而得到一个新的,记录数增1 的有序序列。 直接插入排序算法的伪代码称为InsertionSort,它的参数是一个数组A[1..n],包含了n 个待排序的数。用伪代码表示直接插入排序算法如下: InsertionSort (A) for i←2 to n do key←A[i] //key 表示待插入数 //Insert A[i] into the sorted sequence A[1..i-1] j←i-1 while j>0 and A[j]>key do A[j+1]←A[j] j←j-1 A[j+1]←key 2、快速排序算法思想 快速排序算法的基本思想是,通过一趟排序将待排序序列分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序序列为数组A[1..n],首先选取第一个数A[0],作为枢轴(pivot),然后按照下述原则重新排列其余数:将所有比A[0]大的数都排在它的位置之前,将所有比A[0] 小的数都排在它的位置之后,由此以A[0]最后所在的位置i 作为分界线,将数组A[1..n]分成两个子数组A[1..i-1]和A[i+1..n]。这个过程称作一趟快速排序。通过递归调用快速排序,对子数组A[1..i-1]和A[i+1..n]排序。 一趟快速排序算法的伪代码称为Partition,它的参数是一个数组A[1..n]和两个指针low、high,设枢轴为pivotkey,则首先从high 所指位置起向前搜索,找到第一个小于pivotkey 的数,并将其移到低端,然后从low 所指位置起向后搜索,找到第一个大于pivotkey 的数,并将其移到高端,重复这两步直至low=high。最后,将枢轴移到正确的位置上。用伪代码表示一趟快速排序算法如下: Partition ( A, low, high) A[0]←A[low] //用数组的第一个记录做枢轴记录 privotkey←A[low] //枢轴记录关键字 while low=privotkey do high←high-1 A[low]←A[high] //将比枢轴记录小的记录移到低端 while low

各种排序实验报告

【一】需求分析 课程题目是排序算法的实现,课程设计一共要设计八种排序算法。这八种算法共包括:堆排序,归并排序,希尔排序,冒泡排序,快速排序,基数排序,折半插入排序,直接插入排序。 为了运行时的方便,将八种排序方法进行编号,其中1为堆排序,2为归并排序,3为希尔排序,4为冒泡排序,5为快速排序,6为基数排序,7为折半插入排序8为直接插入排序。 【二】概要设计 1.堆排序 ⑴算法思想:堆排序只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。将序列所存储的元素A[N]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的元素均不大于(或不小于)其左右孩子(若存在)结点的元素。算法的平均时间复杂度为O(N log N)。 ⑵程序实现及核心代码的注释: for(j=2*i+1; j<=m; j=j*2+1) { if(j=su[j]) break; su[i]=su[j]; i=j; } su[i]=temp; } void dpx() //堆排序 { int i,temp; cout<<"排序之前的数组为:"<=0; i--) { head(i,N); } for(i=N-1; i>0; i--) {

temp=su[i]; su[i]=su[0]; su[0]=temp; head(0,i-1); } cout<<"排序之后的数组为:"<

武汉理工大学数据结构与算法综合实验哈夫曼树(1)

学生学号Xxx实验课成绩 学生实验报告书 实验课程名称数据结构与算法综合实验 开课学院计算机科学与技术学院 指导教师姓名xxx 学生姓名xxx 学生专业班级xxxx 2015--2016学年第2学期

实验课程名称:数据结构与算法综合实验 实验项目名称二叉树与赫夫曼图片压缩报告成绩 实验者xx专业班级xxx组别 同组者完成日期2016年5月 2日第一部分:实验分析与设计(可加页) 一、实验目的和要求 1.目的 掌握树的存储结构 掌握二叉树的三种遍历方法 掌握 Huffman树、Huffman编码等知识和应用 使用 C++、文件操作和 Huffman算法实现“图片压缩程序”专题编程。 2.要求 针对一幅 BMP 格式的图片文件,统计 256 种不同字节的重复次数,以每种字 节重复次数作为权值,构造一颗有 256 个叶子节点的哈夫曼二叉树。 利用上述哈夫曼树产生的哈夫曼编码对图片文件进行压缩。 压缩后的文件与原图片文件同名,加上后缀.huf (保留原后缀),如 pic.bmp 压 缩后 pic.bmp.huf 二、分析与设计 依据上述的实验目的与要求,可导出实现的二叉树与赫夫曼图片压缩软件的流程为: ① 读取图片文件、统计权值 ②生成 Huffman树 ③生成 Huffman编码 ④ 压缩图片文件 ⑤ 保存压缩的文件 1.数据结构的设计 记录统计 256种不同字节的重复次数使用整型数组。 int weight[256] = { 0 }; 二叉树的存储结构。使用结构体存储节点,使用数组存储树的节点,使用静态二叉链表方 式存储二叉树。 Huffman编码存储结构 struct HTNode { int weight;//权值

算法实验报告

算法分析与设计实验报告 学院:信息科学与工程学院 专业班级: 指导老师: 学号: 姓名:

目录 实验一:递归与分治 (3) 1.实验目的 (3) 2.实验预习内容 (3) 3.实验内容和步骤 (3) 4.实验总结及思考 (5) 实验二:回溯算法 (6) 1.实验目的: (6) 2.实验预习内容: (6) 3. 实验内容和步骤 (6) 4. 实验总结及思考 (9) 实验三:贪心算法和随机算法 (10) 1. 实验目的 (10) 2.实验预习内容 (10) 3.实验内容和步骤 (10) 4. 实验总结及思考 (13)

实验一:递归与分治 1.实验目的 理解递归算法的思想和递归程序的执行过程,并能熟练编写快速排序算法程序。 掌握分治算法的思想,对给定的问题能设计出分治算法予以解决。 2.实验预习内容 递归:递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。 一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数). 分治:分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。 3.实验内容和步骤 快速排序的基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 源代码: #include using namespace std; int num; void swap(int &a,int &b) { int temp=a; a=b; b=temp; } void printarray(int *arr) { for (int i=1;i<=num;++i) cout<

算法排序问题实验报告

《排序问题求解》实验报告 一、算法得基本思想 1、直接插入排序算法思想 直接插入排序得基本思想就是将一个记录插入到已排好序得序列中,从而得到一个新得, 记录数增 1 得有序序列。 直接插入排序算法得伪代码称为InsertionSort,它得参数就是一个数组A[1、、n],包含了n 个待排序得数。用伪代码表示直接插入排序算法如下: InsertionSort (A) for i←2 ton do key←A[i]//key 表示待插入数 //Insert A[i] into thesortedsequence A[1、、i-1] j←i-1 while j>0 andA[j]>key do A[j+1]←A[j] j←j-1 A[j+1]←key 2、快速排序算法思想 快速排序算法得基本思想就是,通过一趟排序将待排序序列分割成独立得两部分,其中一 部分记录得关键字均比另一部分记录得关键字小,则可对这两部分记录继续进行排序,以达 到整个序列有序。 假设待排序序列为数组A[1、、n],首先选取第一个数A[0],作为枢轴(pivot),然后按照下述原则重新排列其余数:将所有比A[0]大得数都排在它得位置之前,将所有比 A[0]小得数都排在它得位置之后,由此以A[0]最后所在得位置i 作为分界线,将数组 A[1、、n]分成两个子数组A[1、、i-1]与A[i+1、、n]。这个过程称作一趟快速排序。通过递归调用快速排序,对子数组A[1、、i-1]与A[i+1、、n]排序。 一趟快速排序算法得伪代码称为Partition,它得参数就是一个数组A[1、、n]与两个指针low、high,设枢轴为pivotkey,则首先从high所指位置起向前搜索,找到第一个小于pivotkey得数,并将其移到低端,然后从low 所指位置起向后搜索,找到第一个大于pivotkey 得数,并将其移到高端,重复这两步直至low=high。最后,将枢轴移到正确得位置上。用伪代码表示一趟快速排序算法如下: Partition ( A,low,high) A[0]←A[low] //用数组得第一个记录做枢轴记录 privotkey←A[low] //枢轴记录关键字 while low<high //从表得两端交替地向中间扫描 while low=privotkey do high←high-1 A[low]←A[high] //将比枢轴记录小得记录移到低端 while low<high &&A[low]<=pivotkey)dolow←low+1 A[high]←A[low] //将比枢轴记录大得记录移到高端

微机原理实验报告-冒泡排序

WORD格式 一、实验目的 (1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。 (2)理解并掌握各种指令的功能,编写完整的汇编源程序。 (3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。 二、实验内容及要求 (1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。(2)实验要求: ①编制程序,对这组数进行排序并输出原数据及排序后的数据; ②利用DEBUG调试工具,用D0命令,查看排序前后内存数据的变化; ③去掉最大值和最小值,求出其余值的平均值,输出最大值、最小值和平均值; ④用压栈PUSH和出栈POP指令,将平均值按位逐个输出; ⑤将平均值转化为二进制串,并将这组二进制串输出; ⑥所有数据输出前要用字符串的输出指令进行输出提示,所有数据结果能清晰显示。 三、程序流程图 开 始(1)主程序:MAIN 初始化 键盘输入数据 调用INPUT子程序 显示输入错误 否 输入是否正确 是 显示原始数据 调用OUTPUT子程序

WORD格式 显示冒泡排序后的数据 调用SORT子程序 调用OUTPUT子程序 显示最小值Min 显示One子程序 显示最大值Max 调用One子程序 显示其余数平均值Average 调用One子程序 显示平均值二进制串Binary 调用One子程序 结束

(2)冒泡排序子程序:SORT COUNT1----外循环次数 进入COUNT2----内循环次数 i----数组下标 初始化 COUNT1=N-1 COUNT2=COUNT1 SI=0 否 Ai≥i A+1 是 Ai与A i+1两数交换 SI=SI+2 COUNT2=COUNT2-1 否 COUNT2=0? 是 COUNT1=COUNT1-1 否 COUNT2=0? 是 返回

武汉理工大学数据结构2018复习题

复习题集 一判断题 ()1. 在决定选取何种存储结构时,一般不考虑各结点的值如何。 ()2. 抽象数据类型与计算机内部表示和实现无关。 ()3. 线性表采用链式存储结构时,结点和结点内部的存储空间可以是不连续的。 ()4. 链表的每个结点中都恰好包含一个指针。 ()5.链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。()6. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 ()7. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 ()8. 线性表在物理存储空间中也一定是连续的。 ()9. 顺序存储方式只能用于存储线性结构。 ()10.栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 ()11.对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。 ()12.栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 ()13.两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。 ()14.二叉树的度为2。 ()15.若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。 ()16.二叉树中每个结点的两棵子树的高度差等于1。 ()17.用二叉链表法存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。 ()18.具有12个结点的完全二叉树有5个度为2的结点。 ()19.二叉树的前序遍历序列中,任意一个结点均处在其孩子结点的前面。 ()20.在冒泡法排序中,关键值较小的元素总是向前移动,关键值较大的元素总是向后移动。 ()21.计算机处理的对象可以分为数据和非数据两大类。 ()22.数据的逻辑结构与各数据元素在计算机中如何存储有关。 ()23.算法必须用程序语言来书写。 ()24.判断某个算法是否容易阅读是算法分析的任务之一。 ()25.顺序表是一种有序的线性表。 ()26.分配给顺序表的内存单元地址必须是连续的。 ()27.栈和队列具有相同的逻辑特性。 ()28.树形结构中每个结点至多有一个前驱。 ()29.在树形结构中,处于同一层上的各结点之间都存在兄弟关系。 ()30.如果表示图的邻接矩阵是对称矩阵,则该图一定是无向图。 ()31.如果表示图的邻接矩阵是对称矩阵,则该图一定是有向图。 ()32.顺序查找方法只能在顺序存储结构上进行。 ()33.折半查找可以在有序的双向链表上进行。

排序算法实验报告

实验课程:算法分析与设计 实验名称:几种排序算法的平均性能比较(验证型实验) 实验目标: (1)几种排序算法在平均情况下哪一个更快。 (2)加深对时间复杂度概念的理解。 实验任务: (1)实现几种排序算法(selectionsort, insertionsort,bottomupsort,quicksort, 堆排序)。对于快速分类,SPLIT中的划分元素采用三者A(low),A(high),A((low+high)/2)中其值居中者。(2)随机产生20组数据(比如n=5000i,1≤i≤20)。数据均属于范围(0,105)内的整数。对于同一组数据,运行以上几种排序算法,并记录各自的运行时间(以毫秒为单位)。(3)根据实验数据及其结果来比较这几种分类算法的平均时间和比较次数,并得出结论。 实验设备及环境: PC;C/C++等编程语言。 实验主要步骤: (1)明确实验目标和具体任务; (2)理解实验所涉及的几个分类算法; (3)编写程序实现上述分类算法; (4)设计实验数据并运行程序、记录运行的结果; (5)根据实验数据及其结果得出结论; (6)实验后的心得体会。 一:问题分析(包括问题描述、建模、算法的基本思想及程序实现的技巧等):1:随机生成n个0到100000的随机数用来排序的算法如下. for(int n=1000;n<20000;n+=1000) { int a[]=new int[n]; for(int i=0;i

排序算法实验报告

数据结构实验报告 八种排序算法实验报告 一、实验内容 编写关于八种排序算法的C语言程序,要求包含直接插入排序、希尔排序、简单选择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序。 二、实验步骤 各种内部排序算法的比较: 1.八种排序算法的复杂度分析(时间与空间)。 2.八种排序算法的C语言编程实现。 3.八种排序算法的比较,包括比较次数、移动次数。 三、稳定性,时间复杂度和空间复杂度分析 比较时间复杂度函数的情况:

时间复杂度函数O(n)的增长情况 所以对n较大的排序记录。一般的选择都是时间复杂度为O(nlog2n)的排序方法。 时间复杂度来说: (1)平方阶(O(n2))排序 各类简单排序:直接插入、直接选择和冒泡排序; (2)线性对数阶(O(nlog2n))排序 快速排序、堆排序和归并排序; (3)O(n1+§))排序,§是介于0和1之间的常数。 希尔排序 (4)线性阶(O(n))排序 基数排序,此外还有桶、箱排序。 说明: 当原表有序或基本有序时,直接插入排序和冒泡排序将大大减少比较次数和移动记录的次数,时间复杂度可降至O(n); 而快速排序则相反,当原表基本有序时,将蜕化为冒泡排序,时间复杂度提高为O(n2); 原表是否有序,对简单选择排序、堆排序、归并排序和基数排序的时间复杂度影响不大。 稳定性: 排序算法的稳定性:若待排序的序列中,存在多个具有相同关键字的记录,经过排序,这些记录的相对次序保持不变,则称该算法是稳定的;若经排序后,记录的相对次序发生了改变,则称该算法是不稳定的。 稳定性的好处:排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。另外,如果排序算法稳定,可以避免多余的比较; 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序

算法实验报告

云南大学信息学院 计算机科学与技术专业本科《算法设计与分析》 专业:计算机科学与技术 教师:岳昆老师 姓名:张涛 学号:20121120119 2014年12月26 日

实验一算法计算时间复杂度和增长率 (4) 1、实验目的 (4) 2、基本思想 (4) 3、设计与实现的关键技术和主要方法 (4) 4、实验环境 (4) 5、实验结果与结论 (4) 5.1实验结果: (4) 5.2结论: (5) 实验二搜索算法的实现,时间复杂度分析与测试 (6) 1、实验目的 (6) 2、基本思想 (6) 3、设计与实现的关键技术和主要方法 (6) 4、实验环境 (6) 5、实验结果与结论 (6) 5.1实验结果 (6) 5.2结论 (8) 实验三分治算法的递归程序实现与时间复杂度测试 (9) 1、实验目的 (9) 2、基本思想 (9) 3、设计与实现的关键技术和主要方法 (9) 4、实验环境 (9) 5、实验结果与结论 (9) 5.1实验结果: (9) 5.2结论 (10) 实验四动态规划算法的实现与时间复杂度测试 (11) 1、实验目的 (11) 2、基本思想 (11) 3、设计与实现的关键技术和主要方法 (11) 4、实验环境 (11) 5、实验结果与结论 (11) 5.1实验结果: (11) 5.2结论 (12) 实验五动态规划算法的适应性测试 (12) 1、实验目的 (13) 2、基本思想 (13) 3、设计与实现的关键技术和主要方法 (13) 4、实验环境 (13) 5、实验结果与结论 (13) 5.1实验结果 (13) 5.2结论 (14) 实验六贪心算法的实现与时间复杂度测试 (14) 1、实验目的 (15) 2、基本思想 (15)

数据结构(C语言版)实验报告-(内部排序算法比较)

数据结构与算法》实验报告 一、需求分析 问题描述:在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。 基本要求: (l )对以下 6 种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。 (2 )待排序表的表长不小于100000 ;其中的数据要用伪随机数程序产生;至少要用 5 组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为 3 次移动)。 ( 3 )最后要对结果作简单分析,包括对各组数据得出结果波动大小的解释。数据测试:二.概要设计 1. 程序所需的抽象数据类型的定义: typedef int BOOL; typedef struct StudentData { } Data; typedef struct LinkList { Data Record[MAXSIZE]; int num; // 存放关键字 int Length; // 数组长度// 用数组存放所有的随机数 // 说明BOOL 是int 的别名 } LinkList int RandArray[MAXSIZE]; // 定义长度为MAXSIZE 的随机数组 void RandomNum() // 随机生成函数

void InitLinkList(LinkList* L) // 初始化链表 // 比较所有排序 2 . 各程序模块之间的层次(调用)关系: BOOL LT(int i, int j,int* CmpNum) // 比较 i 和 j 的大小 void Display(LinkList* L) // 显示输出函数 void ShellSort(LinkList* L, int dlta[], int t,int* CmpNum, int* ChgNum) void QuickSort (LinkList* L, // 快速排序 void HeapSort (LinkList* L, // 堆排序 void BubbleSort(LinkList* L, // 冒泡排序 void SelSort(LinkList* L, // 选择排序 int* CmpNum, int* ChgNum) int* CmpNum, int* ChgNum) int* CmpNum, int* ChgNum) * CmpNum, int* ChgNum) void Compare(LinkList* L,int* CmpNum, int* ChgNum) // 希尔排序

实验四排序实验报告

数据结构实验报告 实验名称:实验四排序 学生姓名: 班级: 班内序号: 学号: 日期:2012年12月21日 1、实验要求 题目2 使用链表实现下面各种排序算法,并进行比较。 排序算法: 1、插入排序 2、冒泡排序 3、快速排序 4、简单选择排序 5、其他 要求: 1、测试数据分成三类:正序、逆序、随机数据。 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)。 4、对2和3的结果进行分析,验证上述各种算法的时间复杂度。

编写测试main()函数测试线性表的正确性。2、程序分析 2.1存储结构 说明:本程序排序序列的存储由链表来完成。 其存储结构如下图所示。 (1)单链表存储结构: (2)结点结构 struct Node {

int data; Node * next; }; 示意图: 2.2关键算法分析 一:关键算法 (一)直接插入排序void LinkSort::InsertSort() 直接插入排序是插入排序中最简单的排序方法,其基本思想是:依次将待排序序列中的每一个记录插入到一个已排好的序列中,直到全部记录都排好序。 (1)算法自然语言 1.将整个待排序的记录序列划分成有序区和无序区,初始时有序区为待排序记录序列中的第一个记录,无序区包括所有剩余待排序的记录; 2.将无须去的第一个记录插入到有序区的合适位置中,从而使无序区减少一个记录,有序区增加一个记录; 3.重复执行2,直到无序区中没有记录为止。 (2)源代码 void LinkSort::InsertSort() //从第二个元素开始,寻找前面那个比它大的

数据结构各种排序算法的课程设计实验报告(c语言版)

滁州学院 课程设计报告 课程名称:数据结构 设计题目:排序算法实现及比较 系别:计算机信息工程学院 专业:计算机科学与技术 组别:第*组 起止日期:12 年 5 月 1 日~ 12 年6月1 日指导教师:*** 计算机与信息工程学院二○一二年制

课程设计任务书 课程设计题目排序算法实现将比较 组长*** 学号20****** 班级*** 系别计算机与信息工程学院专业计算机科学与技术 组员*** 指导教师*** 课程设计目的⑴加深对常见排序算法理解 ⑵通过程序比较常见算法优越性 ⑶熟悉加深对数据结构的了解及认识 课程设计所需环境Windows xp;VC++6.0 课程设计任务要求 ⑴实现常见排序算法程序化 ⑵测试程序比较算法优越性 ⑶了解常见算法的实际应用课程设计工作进度计划 序号起止日期工作内容分工情况 1 分析实验类容 2 分工 3 算法改编成程序 4 将子程序合并及调试数据测试及记录 5 编写报告 指导教师签字:年月日系(教研室)审核意见: 系(教研室)主任签字:年月日

目录 1.引言 (4) 2.需求分析 (4) 3.详细设计 (4) 3.1 直接插入排序 (4) 3.2折半排序 (5) 3.3 希尔排序 (6) 3.4简单选择排序 (6) 3.5堆排序 (6) 3.6归并排序 (7) 3.7冒泡排序 (9) 4.调试 (10) 5.调试及检验 (11) 5.1 直接插入排序 (11) 5.2折半插入排序 (11) 5.3 希尔排序 (12) 5.4简单选择排序 (12) 5.5堆排序 (13) 5.6归并排序 (14) 5.7冒泡排序 (14) 6.测试与比较 (15) 6.1调试步骤 (15) 6.2结论 (16) 7.实验心得与分析 (16) 8.附录 (17) 8.1直接插入排序 (17) 8.2折半插入排序 (18) 8.3希尔排序 (20) 8.4简单选择排序 (22) 8.5堆排序 (23) 8.6归并排序 (26) 8.7冒泡排序 (29) 8.8主程序 (30)

算法分析与复杂性理论 实验报告 基本排序

深圳大学实验报告 课程名称:算法设计与分析 实验名称:多种排序算法的算法实现及性能比较 学院:计算机与软件学院专业:计算机科学与技术报告人:张健哲学号:2013150372 班级: 3 同组人:无 指导教师:李炎然 实验时间:2015/3/25——2015/4/8 实验报告提交时间:2015/4/8 教务处制

一.实验目的 1.掌握选择排序、冒泡排序、合并排序、快速排序、插入排序算法原理 2.掌握不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性。二.实验步骤与结果 实验总体思路: 利用switch结构来选择实验所要用的排序算法,每一种排序都用相同的计算运行时间的代码,不同的算法就在算法实现部分进行改动(如下代码1至5所示)。不断的改变数据规模,每一个规模在实验时,用循环进行多次实验并作为样本记录消耗的时间。最后输出在不同排序算法下,不同的数据规模的20次实验样本和平均用时(如下图1至5所示)。 各排序算法的实现及实验结果: (注1:以下代码全部为伪代码,具体代码实现请参照程序中的代码) (注2:图中显示的时间单位均为毫秒,图中“排序所花时间”一项为平均消耗时间,平均消耗时间结果以20组样本计算平均值后取整得到(并非四舍五入)。) 1、选择排序 代码1: for i=0 to n-2 min=i for j= i+1 to n-1 if ele[min]>ele[j] min=j swap(ele[i],ele[min]) //交换 图1、选择排序在不同数据规模下排序所消耗的时间

2、冒泡排序 代码2: for i= 0 to n-1 for j=0 to n-1-i if a[j]>a[j+1] swap(a[j],a[j+1]) //交换 图2、冒泡排序在不同数据规模下排序所消耗的时间 3、合并排序 代码3: Merge(ele[1...n],left,right) middle=(left+right)/2 if right>1eft+1 Merge(ele,left,middle) Merge(ele,middle+1,right) l←left r←right i←left while l<=middle&&r<=right //两组分别一一比较,数据小的放入ele if ele[l]<=ele[r] t[i++]←ele[l++] else t[i++]←ele[r++] while l>middle&&r<=r //只剩一组还有剩余的时,将剩下的按顺序放入ele[i++]=s[r++] while l<=middle && r>right ele[i++]=s[l++];

数据结构排序实验报告

《数据结构》课程设计报告 实验五排序 一、需求分析: 本演示程序用C++6.0编写,完成各种排序的实现,对输入的一组数字实现不同的排序方法,对其由小到大顺序输出。 (1)分别对直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序算法进行编写。 (2)、对存储的函数即输入的数字进行遍历。 (3)、初始化函数对输入的数字进行保存。 (4)、主函数实现使用者操作界面的编写,对输入、选择、保存、输出的各种实现。这当中还包括了各个函数的调用的实现。 (5)、程序所能达到的功能:完成对输入的数字的生成,并通过对各排序的选择实现

数字从小到大的输出。 二、程序主要功能以及基本要求: (1)、设计一个菜单,格式如下: 1、直接插入排序 2、希尔排序 3、冒泡排序 4、快速排序 5、选择排序 6、堆排序 7、退出 (2)、选择不同的菜单但进行相应的排序,并给出排序的关键字序列。 三、系统框架图: 本程序包含了9个函数,它们分别是: (1)、直接插入排序的算法函数InsertSort()。 (2)、希尔排序的算法函数ShellSort()。 (4)、快速排序的算法函数Partition()。 (5)、选择排序算法函数SelectSort()。 (6)、堆排序算法函数HeapAdjust()。 (7)、对存储数字的遍历函数Visit()。 (8)、初始化函数InitSqList()。 (9)、主函数main()。 四、详细设计 实现各个算法的主要内容,下面是各个函数的主要信息: (1)各个排序函数的算法:

一、直接插入排序 void InsertSort(SqList &L) { int i,j; for( i=2; i<=L.length;i++) { if(L.r[i].key < L.r[i-1].key) { L.r[0] = L.r[i]; L.r[i] = L.r[i-1]; for( j=i-2; (L.r[0].key < L.r[j].key); j--) L.r[j+1] = L.r[j]; L.r[j+1] = L.r[0]; } } } 二、希尔排序 void ShellSort(SqList &L) { int i, j; int dk = 1;//增量 while(dk <=L.length/3) dk = 3*dk+1;//增大增量 while(dk>0) { dk /= 3;//减小增量 for (i = dk; i <=L.length; i++) { L.r[0].key = L.r[i].key; j = i;

冒泡排序实验报告

2015/2016(1) 实验题目冒泡排序实验学生姓名 学生学号 学生班级 任课教师 提交日期 计算机科学与技术学院

作业内容 对比数组和向量的使用方法。使用函数实现冒泡排序算法,传递参数分别为数组和向量,要求数据不被破坏。 设计思路 主要介绍如何在不破坏原数组的情况下进行对数组的冒泡排序实现方法,在这里,采用了新建数组记录下标的方式: 1、记录方法: 代码: int *d = new int[M];//申请空间 for (int i = 0; i < M; i++) d[i] = i; //记录下标 然后对下标排序: for (int i = 0; i < M - 1; i++) for (int j = 0; j < M - 1 - i; j++) if (c[d[j]]>c[d[j + 1]]) swap(d[j], d[j + 1]);//比较大小后互换位置 最后输出,并且释放申请的内存: cout << "数组排序后顺序:" << endl; for (int i = 0; i < M; i++) cout << c[d[i]] << ' ';//排序完成,输出数据 cout << endl; cout << "数组排序前顺序:" << endl; for (int i = 0; i < M; i++) cout << c[i] << ' ';//输出原数据 cout << endl; delete[] d;//释放申请的空间 程序代码

源.cpp #include #include using namespace std; void Sort(vector &a){ vector b;//记录传入数据在a数组中的下标 for (int i = 0; i < a.size(); i++) b.push_back(i); //记录a数组中的下标 for (int i = 0; i < a.size() - 1; i++) for (int j = 0; j < a.size() - 1 - i; j++) if (a[b[j]]>a[b[j + 1]]) swap(b[j], b[j + 1]);//比较大小后互换位置cout << "数组排序后顺序:" << endl; for (int i = 0; i < a.size(); i++) cout << a[b[i]] << ' ';//排序完成,输出数据cout << endl; cout << "数组排序前顺序:" << endl; for (int i = 0; i < a.size(); i++) cout << a[i] << ' ';//输出原数据 cout << endl; }//对Vector动态数组进行冒泡排序,并输出 void Sort(int c[], int M){ int *d = new int[M];//申请空间 for (int i = 0; i < M; i++) d[i] = i; //记录下标 for (int i = 0; i < M - 1; i++) for (int j = 0; j < M - 1 - i; j++) if (c[d[j]]>c[d[j + 1]]) swap(d[j], d[j + 1]);//比较大小后互换位置

相关文档
最新文档