"排序技术实验报告:掌握排序算法基本思想与实现方法,分析算法时间性能与适应场合"

版权申诉
0 下载量 126 浏览量 更新于2024-03-26 收藏 389KB PDF 举报
本次实验旨在通过对不同排序算法的实现和性能比较,掌握各种排序算法的基本思想、实现方法和时间性能。在实验中,我们使用了随机函数产生10000个和30000个随机数,分别利用直接插入、希尔、冒泡、直接选择、快速、堆、归并等排序方法进行排序,并统计了每种排序所花费的时间。 在实验一中,我们使用了直接插入、希尔、冒泡、直接选择等排序方法对10000个随机数进行排序。直接插入排序是一种比较稳定的排序方法,它的基本思想是将未排序的元素逐个插入已排序的序列中。希尔排序是插入排序的改进版,它通过比较间隔较大的元素进行排序。冒泡排序则是通过比较相邻元素的大小,将较大(或较小)的元素向上(或向下)冒泡。直接选择排序则是每次从未排序的元素中选择最小的元素放到已排序的序列末尾。通过比较这四种排序算法的花费时间,我们可以评估它们的性能优劣和适用场合。 在实验二中,我们使用了快速、堆、归并等排序方法对30000个随机数进行排序。快速排序是一种高效的排序算法,它通过选择一个基准元素将序列分为两部分,然后对每部分递归进行排序。堆排序是利用二叉堆这种数据结构实现的一种排序算法,它的时间复杂度为O(nlogn),在性能上比较优秀。归并排序则是将序列分为若干个子序列,分别进行排序后再合并成一个有序序列。通过比较这三种排序算法的时间性能,我们可以了解它们在处理规模较大数据时的表现。 在实验过程中,我们编写了相应的代码实现各种排序算法,并通过计时计算了每种排序算法所花费的时间。经过实验比较,我们可以得出各种排序算法的优缺点、适用场合以及性能表现。此外,通过实验,我们也更加深入地理解了各种排序算法的基本原理和实现方法,为日后在实际应用中选择合适的排序算法提供了参考依据。 总的来说,本次实验通过对不同排序算法的比较和分析,使我们更加深入地了解了各种排序算法的特点和应用场景,提高了我们的算法设计和分析能力,对我们今后的学习和工作具有重要意义。
2023-03-10 上传
实验十二 排序技术实验 1. 实验目的 1. 掌握各种排序算法的基本思想; 掌握各种排序算法的实现方法; 掌握各种排序算法的时间性能及其花费时间的计算。 掌握各种排序算法所适应的不同场合。 2. 实验内容 1、随机函数产生10000个随机数,用直接插入、希尔、冒泡、直接选择等排序方法 排序,并统计每一种排序所花费的时间。 2、随机函数产生30000个随机数,用快速、堆、归并等排序方法排序,并统计每一种 排序所花费的时间。 3. 设计与编码 #include <iostream> #include <stdlib.h> #include <time.h> using namespace std; void ShuChu(int r[],int n) { cout<<"输出:"; for(int i=0;i<n;i++) cout<<r[i]<<"\t"; cout<<endl; cout<<"*****************************************"<<endl; } void InsertSort(int r[],int n) //插入排序 { int a=r[0]; for(int i=2;i<n;i++) { r[0]=r[i]; for(int j=i-1;r[0]<r[j];j--) r[j+1]=r[j]; r[j+1]=r[0]; } r[0]=a; } void ShellSort(int r[],int n) //希尔排序 { int a=r[0]; for(int d=n/2;d>=1;d=d/2) { for(int i=d+1;i<=n-1;i++) { r[0]=r[i]; for(int j=i-d;j>0 && r[0]<r[j];j=j-d) r[j+d]=r[j]; r[j+d]=r[0]; } } r[0]=a; } void BubbleSort(int r[],int n) //冒泡排序 { int exchange=n-1; while(exchange!=0) { int bound=exchange;exchange=0; for(int j=1;j<bound;j++) if(r[j]>r[j+1]) { int s=r[j+1]; r[j+1]=r[j]; r[j]=s; exchange=j; } } } void SelectSort(int r[],int n) //选择排序 { for(int i=0;i<n-1;i++) { int index=i; for(int j=i+1;j<=n-1;j++) if(r[j]<r[index]) index=j; if(index!=i) { int a=r[index]; r[index]=r[i]; r[i]=a; } } ShuChu(r,n); } int Partition(int r[],int first,int end) //快速排序一次划分算法 { int i=first; int j=end; r[0]=r[i]; int p=r[i]; while(i<j) { while(i<j&&r[i]<=r[j])j--; if(i<j) { int a=r[j]; r[j]=r[i]; r[i]=a; i++; } while(i<j&&r[i]<=r[j])i++; if(i<j) { int b=r[j]; r[j]=r[i]; r[i]=b; j--; } } return i; } void QuickSort(int r[],int first,int end) //快速排序算法 { int a=r[0]; if(first<end) { int pivot=Partition(r,first,end); QuickSort(r,first,pivot-1); QuickSort(r,pivot+1,end); } r[0]=a; } void Sift(int r[],int k,int m) //筛选法调整堆的算法 { int i=k; int j=2*i; while(j<=m) { if(j<m&&r[j]<r[j+1])j++; if(r[i]>=r[j])break; else { int a=r[j]; r[j]=r[i]; r[i]=a; i=j; j=2*i; } } } void HeapSort(int r[],int n) //堆排序算法 { for(int i=n/2;i>=1;i--) Sift(r,i,n-1); for(i=2;i<n-1;i++) { int a=r[n-i+1]; r[n-i+1]=r[1]; r[1]=a; Sift(r,1
2023-03-11 上传
《数据结构》 课程设计报告 专 业 计算机科学与技术 班 级 姓 名 学 号 指导教师 起止时间 2012.12~2013.1 课程设计:排序综合 任务描述 排序综合 任务:利用随机函数产生n个随机整数(20000以上),对这些数进行多种方法进行排序 。 要求: (1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序 、起泡排序、快速排序、选择排序、堆排序、归并排序)。并把排序后的结果保存在不 同的文件中。 (2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出 其中两种较快的方法。 二、问题分析 1、功能分析 分析设计课题的要求,要求编程实现以下功能: (1)排序表的建立—即创建顺序表; (2)顺序表的排序—即直接插入排序、希尔排序、起泡排序、快速排序、简单选择排 序操作; (3)统计每一种排序方法的性能—即测试上机运行程序所花费的时间; 2、数据对象分析 数据信息:随机整数 数据数量可以预先确定(20000以上) 数据结构设计 使用顺序表实现,有关定义如下: typedef int Status; typedef int KeyType ; //设排序码为整型量 typedef int InfoType; typedef struct { //定义被排序记录结构类型 KeyType key ; //排序码 I nfoType otherinfo; //其它数据项 } RedType ; typedef struct { RedType * r; //存储带排序记录的顺序表 //r[0]作哨兵或缓冲区 int length ; //顺序表的长度 } SqList ; //定义顺序表类型 四、功能设计 (一)主控菜单设计 为实现通各种排序的功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为 这些菜单项配上相应的功能。 程序运行后,给出6个菜单项的内容和输入提示,如下: 1. 直接插入排序 2. 希尔排序 3. 起泡排序 4. 快速排序 5. 简单选择排序 0. 退出系统 (二)程序模块结构 由课题要求可将程序划分为以下几个模块(即实现程序功能所需的函数): 主控菜单项选择函数menu() 创建排序表函数 InitList_Sq() 对顺序表L进行直接插入排序函数Insertsort() 希尔排序函数ShellSort(); 起泡排序函数Bubble_sort() 快速排序函数QSort ( ) 简单选择排序函数SelectSort() (三)函数调用关系 程序的主要结构(函数调用关系)如下图所示。 Menu() InitList_Sq(L) Main() Insertsort(L) ShellSort() Bubble_sort() QSort ( ) SelectSort() 其中main()是主函数,它进行菜单驱动,根据选择项0~5调用相应的函数。main()函数使 用for循环实现重复选择。其循环结构如下: for (;;) { long start,end; switch(menu()) { case 1: printf("* 直接插入排序 *\n"); start=clock(); Insertsort(L); end=clock(); printf("%d ms\n",end-start); fp=fopen("D:直接插入排序.txt","w"); if(fp==NULL)//打开文件失败 { printf("打开文件失败!\n"); exit(1); } for(i=1;i<=L.length;i++) fprintf(fp,"%d ",L.r[i]); fclose(fp); break; case 2: printf("* 希尔排序 *\n"); start=clock(); ShellSort(L,an,14); end=clock(); printf("%d ms\n",end-start); fp=fopen("D:希尔排序 .txt","w"); if(fp==NULL)//打开文件失败 { printf("打开文件失败!\n"); exit(1); } for(i=1;i<=L.length;i++) fprintf(fp,"%d ",L.r[i]); fclose(fp); break; case 3: printf("* 起泡排序 *\n"); start=clock(); Bubble_sort(L); end=clock(); printf("%d ms\n",end-start); fp=fopen("D: 起泡排序 .txt","w"); if(fp==NULL)//打开文件失败 { printf("打开文件失败!\n"); exi