实验6 内部排序实验报告

合集下载

内部排序实验报告

内部排序实验报告

数据结构实验报告内部排序班级:13 软工一班学号:13131113 姓名:吕蒙学号:13131116 姓名:钱剑滨学号:13131142 姓名:孔亚亚学号:13131144 姓名:邱佃雨13软工转本1 钱剑滨实验报告内部排序实验报告信息工程系 13软工转本1 日期 2016年06月07日一、实验内容编写程序实现各种内部排序(包括:冒泡排序、插入排序、选择排序、希尔排序、快速排序、堆排序、归并排序、基数排序),并运用这些排序对一组随机生成的数组进行排序。

二、时间复杂度1.冒泡排序(O(n^2))若文件的初始状态是正序的,一趟扫描即可完成排序。

所需的关键字比较次数和记录移动次数均达到最小值:,。

所以,冒泡排序最好的时间复杂度为。

若初始文件是反序的,需要进行趟排序。

每趟排序要进行次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。

在这种情况下,比较和移动次数均达到最大值:冒泡排序的最坏时间复杂度为。

综上,因此冒泡排序总的平均时间复杂度为。

2.插入排序(O(n^2))如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。

最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。

最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。

插入排序的赋值操作是比较操作的次数加上(n-1)次。

平均来说插入排序算法的时间复杂度为O(n^2)。

因而,插入排序不适合对于数据量比较大的排序应用。

但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。

3.选择排序(O(n^2))选择排序的交换操作介于0 和(n - 1)次之间。

选择排序的比较操作为n (n - 1)/ 2 次之间。

选择排序的赋值操作介于0 和3 (n - 1)次之间。

比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。

内部排序实验报告总结

内部排序实验报告总结

内部排序实验报告总结内部排序实验报告总结一、引言内部排序是指对一个存储在计算机内存中的数据集合进行排序的过程。

在本次实验中,我们对常见的内部排序算法进行了实验比较,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序和快速排序。

通过比较这些算法的执行时间和空间复杂度,我们可以评估它们在不同数据集上的性能。

二、实验目的1. 比较不同内部排序算法在不同数据集上的性能差异;2. 了解各种内部排序算法的实现原理;3. 掌握如何分析和评估算法的时间复杂度和空间复杂度。

三、实验方法1. 实验环境:使用具有相同硬件配置和操作系统版本的计算机进行测试。

2. 实验数据:选择多个不同大小和特征的数据集进行测试,包括随机数列、有序数列和逆序数列。

3. 实验步骤:3.1 实现各个内部排序算法;3.2 对每个数据集分别运行各个算法,并记录执行时间;3.3 分析结果并比较各个算法之间的性能差异。

四、实验结果与分析1. 冒泡排序:冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,并按照大小交换它们的位置。

经过多次遍历,最大(或最小)的元素会逐渐移动到数列的末尾。

冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。

在本次实验中,冒泡排序在随机数列上表现良好,但在有序数列和逆序数列上性能较差。

这是因为冒泡排序需要进行多次交换操作,而有序数列和逆序数列中元素已经接近或完全有序,交换操作并不频繁。

2. 选择排序:选择排序是一种简单直观的排序算法,它每次从待排序的数据中选择最小(或最大)的元素,并将其放到已排好序的部分末尾。

选择排序的时间复杂度为O(n^2),空间复杂度为O(1)。

实验结果显示,选择排序在各种数据集上都表现稳定。

这是因为选择排序每次只需进行一次交换操作,相对于冒泡排序来说更加高效。

3. 插入排序:插入排序是一种简单直观且稳定的内部排序算法,它将待排序的数据分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的适当位置。

内部排序比较 (实验报告+源程序)C++

内部排序比较  (实验报告+源程序)C++

实验报告3实验名称:数据结构与软件设计实习题目:内部排序算法比较专业:生物信息学班级:01 姓名:学号:实验日期:2010.07.24一、实验目的:比较冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序;二、实验要求:待排序长度不小于100,数据可有随机函数产生,用五组不同输入数据做比较,比较的指标为关键字参加比较的次数和关键字移动的次数;对结果做简单的分析,包括各组数据得出结果的解释;设计程序用顺序存储。

三、实验内容对各种内部排序算法的时间复杂度有一个比较直观的感受,包括关键字比较次数和关键字移动次数。

将排序算法进行合编在一起,可考虑用顺序执行各种排序算法来执行,最后输出所有结果。

四、实验编程结果或过程:1. 数据定义typedef struct { KeyType key; }RedType; typedef struct { RedType r[MAXSIZE+1]; int length;}SqList;2. 函数如下,代码详见文件“排序比较.cpp”int Create_Sq(SqList &L)void Bubble_sort(SqList &L)//冒泡排序void InsertSort(SqList &L)//插入排序void SelectSort(SqList &L) //简单选择排序int Partition(SqList &L,int low,int high) void QSort(SqList &L,int low,int high)//递归形式的快速排序算法void QuickSort(SqList &L)void ShellInsert(SqList &L,int dk)//希尔排序void ShellSort(SqList &L,int dlta[ ])3. 运行测试结果,运行结果无误,如下图语速个数为20元素个数为100错误调试无。

排序算法实验报告

排序算法实验报告

排序算法实验报告(内部排序算法比较)主要实验内容:对各种内部排序算法进行比较要求:(1)任意输入5组各50个数据;(2)对冒泡排序、直接插入排序、简单选择排序、快速排序、堆排序的关键字比较和交换次数进行统计。

源程序代码://主函数文件”sort.cpp”#include<iostream>#include<cstdlib>using namespace std;#include"Sort.h"#define NUMLEN 50 //要排序数组的元素个数/***********************main函数部分*******************************************/void main(){Rec* createData(int i,int &n); //创建5 组数据元素void DataHandle(Sort &data,Rec *r,int n); //处理每种排序的调用过程void ShowData(int i,Rec *r,int n); //显示创建好的未排序过的数组元素int n; //记录待排序数组元素的个数Rec *r; //用以储存待排序的数组元素Sort data; //创建排序对象,通过对象调用排序函数,完成对数据元素的排序for(int i=0;i<5;i++){r=createData(i,n);ShowData(i,r,n);DataHandle(data,r,n);}}/******************************************************************************/Rec* createData(int i,int &n){n=NUMLEN; int j;Rec *r=new Rec[n+1];r[0].key=0;switch(i+1){case 1://创建升序排序的1 - 50 的数组for(j=1;j<=n;j++)r[j].key=j;break;case 2://创建降序排序的50 - 1 的数组for(j=1;j<=n;j++)r[j].key=n+1-j;break;case 3://创建前半部分是升序排序的1 - 25 的数组,后半部分降序排序的50 - 26 的数组for(j=1;j<=n/2;j++)r[j].key=j;if(n%2==0)for(j=1;j<=n/2;j++)r[j+n/2].key=n+1-j;else for(j=1;j<=n/2+1;j++)r[j+n/2].key=n+1-j;break;case 4://创建一个全部元素都都为1 的数组for(j=1;j<=n;j++)r[j].key=3;break;case 5://程序随机的创建一个大小为n 的范围为1 - 1000 之间的随机数组srand(333);for(j=1;j<=n;j++)r[j].key=rand()%1000+1;break;default:return NULL;}return r;}/***********************ShowData函数部分***************************************//*功能:显示创建好的未排序的数组元素*/void ShowData(int i,Rec *r,int n){cout<<endl<<"********************************************************************************";cout<<"The "<<i+1<<" primary array is :"<<endl;for(int j=1;j<=n;j++)cout<<r[j].key<<" ";cout<<endl<<"********************************************************************************"<<endl; }void DataHandle(Sort &data,Rec *r,int n){cout<<endl<<"Bubble sort"<<endl;data.CreateData(r,n);data.BubbleSort();data.display();cout<<"Exchange times: "<<data.GCExTimes()<<endl;cout<<"Compare times: "<<data.GCCoTimes()<<endl;data.Delete();cout<<endl<<"Insert sort"<<endl;data.CreateData(r,n);data.InsertSort();data.display();cout<<"Exchange times: "<<data.GCExTimes()<<endl;cout<<"Compare times: "<<data.GCCoTimes()<<endl;data.Delete();cout<<endl<<"Select sort"<<endl;data.CreateData(r,n);data.SelectSort();data.display();cout<<"Exchange times: "<<data.GCExTimes()<<endl;cout<<"Compare times: "<<data.GCCoTimes()<<endl;data.Delete();cout<<endl<<"Quick sort"<<endl;data.CreateData(r,n);data.QuickSort();data.display();cout<<"Exchange times: "<<data.GCExTimes()<<endl;cout<<"Compare times: "<<data.GCCoTimes()<<endl;data.Delete();cout<<endl<<"Heap sort"<<endl;data.CreateData(r,n);data.HeapSort();data.display();cout<<"Exchange times: "<<data.GCExTimes()<<endl;cout<<"Compare times: "<<data.GCCoTimes()<<endl;data.Delete();cout<<endl;}/******************************************************************************///Sort排序类的文件”Sort.h”#ifndef SORT#define SORT/******************************************************************************/ /*数据类型的定义*/typedef int Key;typedef struct{Key key;}Rec;/******************************************************************************//***************Sort排序类*****************************************************/ /*功能:1 类中的成员函数完成对数据的排序2 数据的录入3 记录交换和比较次数4 显示数据*//*排序函数分别有:冒泡排序,直接插入排序,选择排序,快速排序,堆排序*/class Sort{private:Rec *r; //储存数据所用数组int n; //记录数据数量int ExchangeTimes; //交换次数int CompareTimes; //比较次数void qksort0(int s,int t); //快速排序递归用函数void qkpass(int s,int t,int &k); //快速排序递归函数void sift(int k,int m); //堆排序所用递归函数public:Sort();Sort(Rec r[],int n);void CreateData(Rec r[],int n);void BubbleSort(); //冒泡排序void InsertSort(); //直接插入排序void SelectSort(); //简单选择排序void QuickSort(); //快速排序void HeapSort(); //堆排序int GCExTimes(); //获取交换次数并对交换次数清零int GCCoTimes(); //获取比较次数并对交换次数清零void display(); //显示数据void Delete(); //删除剩余的储存空间};/******************************************************************************/Sort::Sort(){ r=NULL;n=0;ExchangeTimes=0;CompareTimes=0;}Sort::Sort(Rec r[],int n){ this->r=new Rec[n+1];this->n=n;for(int i=0;i<=n;i++)this->r[i]=r[i];ExchangeTimes=0;CompareTimes=0;}/******************************************************************************/ /************CreateData函数****************************************************/ /*功能:调用类中的函数完成对数据的初始化*/void Sort::CreateData(Rec r[],int n){this->r=new Rec[n+1];this->n=n;for(int i=0;i<=n;i++)this->r[i]=r[i];ExchangeTimes=0;CompareTimes=0;}/******************************************************************************//*************BubbleSort冒泡排序***********************************************/ /*功能:用冒泡法对数据进行排序(排序稳定)*/void Sort::BubbleSort(){bool flag;Rec t;for(int i=1;i<=n-1;i++){flag=true;for(int j=1;j<=n-i;j++){CompareTimes++;if(r[j+1].key<r[j].key){flag=false;t=r[j];r[j]=r[j+1];r[j+1]=t;ExchangeTimes++;}}if(flag)break;}}/********************InsertSort直接插入排序************************************/ /*功能:用直接插入排序的方法对数据进行排序(排序稳定)*/void Sort::InsertSort(){for(int i=2;i<=n;i++){r[0]=r[i];CompareTimes++;for(int j=i-1;r[j].key>r[0].key;j--){r[j+1]=r[j];CompareTimes++;}r[j+1]=r[0];}}/******************************************************************************//***********************SelectSort选择排序*************************************/ /*功能:用选择排序的方法对数据进行排序(排序不稳定)*/void Sort::SelectSort(){int k;for(int i=1;i<=n-1;i++){r[0]=r[i]; k=i;for(int j=i+1;j<=n;j++){CompareTimes++;if(r[j].key<r[k].key)k=j;}if(i!=k){r[i]=r[k];r[k]=r[0];ExchangeTimes++;}}}/******************************************************************************//****************QuickSort快速排序*********************************************/ /*功能:用快速排序的方法完成对数据的排序(递归函数) (排序不稳定)*//*在记录快速排序的比较次数的时候,着实费了些工夫,不过最后还是弄出来了*/void Sort::QuickSort(){qksort0(1,n);int k;if(s<t){this->qkpass(s,t,k);this->qksort0(s,k-1);this->qksort0(k+1,t);}}void Sort::qkpass(int s,int t,int &k)//快速排序中的递归函数{int i=s;int j=t;r[0]=r[s];while(i<j){while(i<j&&r[j].key>=r[0].key)//快速排序比价次数的记录应该在这{CompareTimes++;j--;}if(i!=j)CompareTimes++;/*在循环外还有一个满足(i!=j)条件后比较次数的自加,这是因为这个循环的条件不止有关键字比较的条件来跳出循环,还有一另一个条件(i<j)来条出循环,而因为这个条件跳出循环的时,是不需要进行关键字比较的,所以这要多一个if的条件判断*/ r[i]=r[j];while(i<j&&r[i].key<=r[0].key){CompareTimes++;i++;}r[j]=r[i];if(i!=j)CompareTimes++;}if(i!=s){ r[i]=r[0]; ExchangeTimes++; }k=i;}/******************************************************************************//***************HeapSort堆排序*************************************************//*功能:用堆排序方法完成对数据的排序(排序不稳定)*/void Sort::HeapSort(){int i,m;Rec t;m=n/2;for(i=m;i>=1;i--)sift(i,n);for(i=n;i>=2;i--){t=r[1];r[1]=r[i];r[i]=t;ExchangeTimes++;sift(1,i-1);}}i=k;j=2*i;r[0]=r[k];finished=false;while(j<=m&&!finished){ CompareTimes++;if(j<m&&(r[j].key<r[j+1].key))j++;CompareTimes++;if(r[0].key>=r[j].key)finished=true;else{ r[i]=r[j]; i=j; j=2*i; }}if(i!=k){ r[i]=r[0]; ExchangeTimes++; }}/******************************************************************************//*****************display函数**************************************************/ /*功能:显示排序好的数组*/void Sort::display(){for(int i=1;i<=n;i++)cout<<r[i].key<<" ";cout<<endl;}/******************************************************************************/ /***********GCExTimes函数******************************************************/ /*功能:获取交换次数并对交换次数清零*/int Sort::GCExTimes(){ int t=ExchangeTimes; ExchangeTimes=0;return t;}/******************************************************************************/ /***********GCCoTimes函数******************************************************/ /*功能:获取比较次数并对交换次数清零*/int Sort::GCCoTimes(){ int t=CompareTimes; CompareTimes=0;return t;}/******************************************************************************//**********Delete函数**********************************************************/ /*功能:删除不需要用的储存空间,减少空间的占有量*/void Sort::Delete(){ delete[] r;n=0;}/******************************************************************************/******************************************************************************** The 1 primary array is :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50********************************************************************************Bubble sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 0Compare times: 49Insert sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 0Compare times: 49Select sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 0Compare times: 1225Quick sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 0Compare times: 1225Heap sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 122Compare times: 444******************************************************************************** The 2 primary array is :50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 2423 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1********************************************************************************Bubble sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 1225Compare times: 122531 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 0Compare times: 1274Select sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 25Compare times: 1225Quick sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 25Compare times: 1250Heap sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 96Compare times: 386******************************************************************************** The 3 primary array is :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 50 49 48 47 4645 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26********************************************************************************Bubble sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 300Compare times: 925Insert sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 0Compare times: 349Select sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 12Compare times: 122531 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 12Compare times: 1237Heap sort1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50Exchange times: 122Compare times: 430******************************************************************************** The 4 primary array is :3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 33 3 3 3 3 3 3 3 3 3********************************************************************************Bubble sort3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 33 3 3 3 3 3 3 3 3 3Exchange times: 0Compare times: 49Insert sort3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 33 3 3 3 3 3 3 3 3 3Exchange times: 0Compare times: 49Select sort3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 33 3 3 3 3 3 3 3 3 3Exchange times: 0Compare times: 1225Quick sort3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 33 3 3 3 3 3 3 3 3 3Exchange times: 0Compare times: 1225Heap sort3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 33 3 3 3 3 3 3 3 3 3Exchange times: 49Compare times: 146******************************************************************************** The 5 primary array is :127 227 232 129 969 679 4 776 787 922 137 1 589 184 960 338 441 501 803 844 252700 90 472 585 882 972 388 815 762 721 774 587 601 784 193 49 709 941 982 511 370 886 164 314 597 709 915 870 21********************************************************************************Bubble sort1 4 21 49 90 127 129 137 164 184 193 227 232 252 314 338 370 388 441 472 501 511585 587 589 597 601 679 700 709 709 721 762 774 776 784 787 803 815 844 870 882886 915 922 941 960 969 972 982Exchange times: 530Compare times: 1224Insert sort1 4 21 49 90 127 129 137 164 184 193 227 232 252 314 338 370 388 441 472 501 511585 587 589 597 601 679 700 709 709 721 762 774 776 784 787 803 815 844 870 882886 915 922 941 960 969 972 982Exchange times: 0Compare times: 579Select sort1 4 21 49 90 127 129 137 164 184 193 227 232 252 314 338 370 388 441 472 501 511585 587 589 597 601 679 700 709 709 721 762 774 776 784 787 803 815 844 870 882886 915 922 941 960 969 972 982Exchange times: 46Compare times: 1225Quick sort1 4 21 49 90 127 129 137 164 184 193 227 232 252 314 338 370 388 441 472 501 511585 587 589 597 601 679 700 709 709 721 762 774 776 784 787 803 815 844 870 882886 915 922 941 960 969 972 982Exchange times: 25Compare times: 339Heap sort1 4 21 49 90 127 129 137 164 184 193 227 232 252 314 338 370 388 441 472 501 511585 587 589 597 601 679 700 709 709 721 762 774 776 784 787 803 815 844 870 882886 915 922 941 960 969 972 982Exchange times: 118Compare times: 430实验数据分析:本实验一共用了5组数, 每组50个元素的数据测试了这五种排序, 并记录了交换和比较次数, 从这些比较次数中看出每种排序的效率和快慢。

数据结构实验(6)查找和排序

数据结构实验(6)查找和排序

计算机系数据结构实验报告(x)姓名:陈科健学号:6100113017 专业班级:电子商务131 实验名称:查找和排序实验目的:深入了解各种内部排序方法及效率分析。

问题描述:各种内部排序算法的时间复杂度分析,试通过随机数据比较算法的关键字比较次数和关键字移动次数。

实验要求:1、对起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序这六种常用排序算法进行分析。

2、用代码实现上述算法中任意两种排序算法。

3、设计待排序表的表长不超过100(其中数据最好用伪随机数产生程序产生,也可以自己设计一组待排序数据)。

4、要对实验结果做简单分析。

算法分析:实验内容和过程:#include<stdio.h>#include<stdlib.h>typedef struct{int key;}Key;typedef struct{Key r[6];}SqList;void BubbleSort(int *a,int n){int i, j,t;for (i = 0; i < n - 1; i++){for (j = 0; j <n-i-1;j++){if (a[j]>a[j+1]){t = a[j];a[j] = a[j+1];a[j+1] = t;}}}for (i = 0; i < n ; i++){printf("%5d", a[i]);}}int Partition(SqList &L, int low, int high){int pivotkey;L.r[0] = L.r[low];pivotkey = L.r[low].key;while (low < high){while (low < high && L.r[high].key >= pivotkey) --high;L.r[low] = L.r[high];while (low < high && L.r[high].key <= pivotkey) ++low;L.r[high] = L.r[low];}L.r[low] = L.r[0];return low;}void QSort(SqList &L, int low, int high){int pivotloc;if (low < high){pivotloc = Partition(L, low, high);QSort(L, low, pivotloc-1);QSort(L, pivotloc + 1, high);}}void QuickSort(SqList &L){int i;QSort(L,0,5);for (i = 0; i < 6; i++){printf("%5d", L.r[i].key);}}int main(){int i, a[6]; SqList L;printf(" ** 起泡排序**\n\n");printf("请输入6个数:\n");for (i = 0; i < 6; i++){scanf_s("%d", &a[i]);}printf("排序后:\n");BubbleSort(a, 6);printf("\n\n ** 快速排序**\n\n");printf("请输入6个数:\n");for (i = 0; i < 6; i++){scanf_s("%d", &L.r[i].key);}printf("排序后:\n");QuickSort(L);system("pause");}实验结果:总结和感想:起泡还好做。

内部排序实验报告

内部排序实验报告
//所在位置,此时在它之前(后)的记录均不大(小)于它。算法 10.6(b)
KeyType pivotkey; L.r[0]=L.r[low]; pivotkey=L.r[low].key;
//用子表的第一个记录作枢轴记录 //枢轴记录关键字
while(low< high) {
//从表的两端交替地向中间扫描
h.r[i+1]=d[i]; h.length=N; printf("\n 堆排序前:\n"); print_H(h); HeapSort(h); printf("堆排序后:\n"); print_H(h); goto s123;
case 4: for(i=0;i<N;i++) LL.r[i+1]=d[i]; LL.length=N; printf("归并排序前:\n"); print(LL); MergeSort(LL); printf("归并排序后:\n"); print(LL); goto s123;
RedType d[N]={{20,6},{52,1},{65,3},{88,9},{47,8},{22,4},{39,5},{74,7}}; int i; SqList LL; int dt[T]={5,3,1}; // 增量序列数组 int choice;
s123: cout<<"请选择要使用的排序算法:\n0..............退出\n"; cout<<"1..............插入排序\n2..............交换排序\n"; cout<<"3..............选择排序\n4..............归并排序\n"; cin>>choice; switch(choice) { case 0: break;

内部排序实验报告

内部排序实验报告内部排序实验报告一、引言内部排序是计算机科学中的重要概念,它指的是对一个数据集合进行排序的过程。

在计算机科学中,排序算法是一种基本的算法,它对于提高数据处理效率和优化算法性能有着重要的作用。

本实验旨在通过实际操作和对比分析,探究不同内部排序算法的性能差异。

二、实验目的1. 了解内部排序的基本概念和常用算法;2. 掌握不同内部排序算法的实现方法;3. 比较不同内部排序算法的时间复杂度和空间复杂度;4. 分析实验结果,总结不同算法的优缺点。

三、实验过程1. 实验环境搭建在进行实验之前,我们需要搭建适当的实验环境。

选择一种编程语言,并准备好相应的开发环境。

2. 实验数据准备为了进行排序算法的测试,我们需要准备一组测试数据。

可以选择不同规模的数据集,包括有序、无序和部分有序等情况。

3. 实验算法实现选择几种常用的内部排序算法,如冒泡排序、插入排序、选择排序、快速排序和归并排序等。

分别实现这些算法,并确保其正确性。

4. 实验性能测试使用不同规模的测试数据对算法进行性能测试。

记录每个算法的运行时间和所占用的内存空间。

5. 实验结果分析根据实验数据和测试结果,对比分析不同算法的性能差异。

针对时间复杂度和空间复杂度,给出相应的分析和解释。

四、实验结果与分析经过实验测试,我们得到了不同内部排序算法的运行时间和内存占用情况。

下面对实验结果进行分析和解释。

1. 时间复杂度分析通过实验数据,我们可以观察到不同算法的运行时间随着数据规模的增加而增加。

快速排序和归并排序在大规模数据集上表现出色,时间复杂度为O(nlogn)。

而冒泡排序和选择排序的时间复杂度为O(n^2),在大规模数据集上性能较差。

2. 空间复杂度分析在内部排序中,空间复杂度是指算法执行过程中所需的额外内存空间。

插入排序和冒泡排序是原地排序算法,它们的空间复杂度为O(1)。

而归并排序和快速排序需要额外的空间来存储中间结果,空间复杂度为O(n)。

实验六 排序

实验六排序
一、实验目的
1、掌握内部排序的基本算法;
2、分析比较内部排序算法的效率。

二、实验预习
说明以下概念
1、简单排序:
2、希尔排序:
三、实验内容和要求
1、输入待排序序列:49 38 65 97 13 27 49(以输入一个字符作为结束)1)直接插入排序运行结果(写出每一趟的状态):
2)希尔排序运行结果(写出每一趟的状态):
2、编程实现直接插入排序算法。

1)待排序列为整数序列,如34,67,23,6,10 ……
程序代码:
运行结果:
2)待排序列为一组记录,列由学号、姓名、性别、数据结构成绩组成,按照数据结构成绩列排序。

程序代码:
运行结果:
3、编程实现希尔排序算法。

1)待排序列为整数序列,如34,67,23,6,10 ……
程序代码:
运行结果:
2)待排序列为一组记录,列由学号、姓名、性别、数据结构成绩组成,按照数据结构成绩列排序。

程序代码:
运行结果:。

实验6 内部排序

实验六内部排序一、实验目的1、掌握插入排序、选择排序、交换排序等各种排序方法的基本思想并能用C/C++语言实现。

2、掌握各种排序方法的特点及适用情形,并能在解决实际问题的过程中灵活选用不同的排序方法。

3、掌握各种排序方法的操作过程及其依据。

,二、实验环境PC微机,Windows,DOS,Turbo C或Visual C++三、实验内容1、学生成绩统计、排序的实现(1)问题描述在学生成绩管理中,经常会遇到求平均成绩,统计不及格学生成绩,统计优秀学生人数,以及按成绩对学生进行排名等。

现假设有某个班级的若干名学生,每个学生都考试完成了相同的4门课程,试对所有学生的成绩完成以下工作:1)求每门课程的平均成绩。

2)输出有课程不及格学生的姓名、学号及其各门课程的成绩。

3)输出个人平均分超过90分的学生姓名、学号。

4)对4门课程中的任何一门,可随意抽取1门按学生成绩进行排序。

(2)基本要求由于问题描述中涉及的学生个人信息包含的内容较多,要完成所有工作必须设计较为合理的数据结构,否则在算法实现时,可能会增加不少难度。

在对某门课程按成绩进行排序时,要根据实际情况,灵活选用排序方法。

在编程实现时,一定要体现清晰的算法思想,注重程序的实现性和通用性。

算法:#include "stdio.h"#include "conio.h"int i;int temp;int j;int choose;struct{int stuid;char stuname[20];char obj1[20];char obj2[20];char obj3[20];char obj4[20];int grade1;int grade2;int grade3;int grade4;}info[3];/*初始化数据*/void inputinfo(){for(i=0;i<3;i++){printf("The %d student id :",i+1);scanf(" %d",&info[i].stuid);printf("The %d student name:",i+1);scanf(" %c",&info[i].stuname);getchar();printf("The %d student objectname1:",i+1);scanf(" %c",&info[i].obj2);getchar();printf("The %d student grade1:",i+1);scanf(" %d",&info[i].grade1);getchar();printf("The %d student objectname2:",i+1);scanf(" %c",&info[i].obj2);getchar();printf("The %d student grade2:",i+1);scanf(" %d",&info[i].grade2);getchar();printf("The %d student objectname3:",i+1);scanf(" %c",&info[i].obj3);getchar();printf("The %d student grade3:",i+1);scanf(" %d",&info[i].grade3);getchar();printf("The %d student objectname4:",i+1);scanf(" %c",&info[i].obj4);getchar();printf("The %d student grade4:",i+1);scanf(" %d",&info[i].grade4);}}/*每门课程的平均成绩*/void getAveGrade(){int grade1 = 0;int grade2 = 0;int grade3 = 0;int grade4 = 0;for(i=0;i<3;i++){grade1 = grade1 + info[i].grade1;grade2 = grade2 + info[i].grade2;grade3 = grade3 + info[i].grade3;grade4 = grade4 + info[i].grade4;}printf("The %c is: %d",info[0].obj1,grade1/3);printf("The %c is: %d",info[1].obj2,grade2/3);printf("The %c is: %d",info[2].obj3,grade3/3);printf("The %c is: %d",info[3].obj4,grade4/3);}/*输出有课程不及格学生的姓名,学号及其各门课程的成绩*/void getflunkinfo(){for(i=0;i<3;i++){if(info[i].grade1<60 || info[i].grade2<60 || info[i].grade3<60 || info[i].grade4<60){printf("Student id: %d",info[i].stuid);printf("Student Name: %c",info[i].stuname);printf("The %c : %d",info[i].obj1,info[i].obj1);printf("The %c : %d",info[i].obj2,info[i].obj2);printf("The %c : %d",info[i].obj3,info[i].obj3);printf("The %c : %d",info[i].obj4,info[i].obj4);}}}/*输出个人平均分超过90分的学生姓名,学号*/void getGoodStudent(){for(i=0;i<3;i++){int count = (info[i].grade1 + info[i].grade2 + info[i].grade3 + info[i].grade4)/3;if(count>=90){printf(" The good student id is : %c",info[i].stuid);printf(" The good student name is : %c",info[i].stuname);}}}/*对4门课程中的任何一门,可随意抽取1门按学生成绩进行排序*/ void geteachgrade(){int count[3];printf("Please input the number 1~4: ");scanf(" %d",&choose);if(choose==1){for(i=0;i<3;i++){count[i] = info[i].grade1;}}else if(choose==2){for(i=0;i<3;i++){count[i] = info[i].grade2;}}else if(choose==3){for(i=0;i<3;i++){count[i] = info[i].grade3;}}else if(choose==4){for(i=0;i<3;i++){count[i] = info[i].grade4;}}/*冒泡排序*/for(i=0;i<10;i++){for(j=0;j<10;j++){if(count[j]<count[i]){temp = count[i];count[i] = count[j];count[j] = temp;}}}for(i=0;i<10;i++){printf(" %d ",count[i]);}}void main(){inputinfo();printf("Please input the number 1~4: ");scanf(" %d",&choose);if(choose==1){getAveGrade();}else if(choose==2){getflunkinfo();}else if(choose==3){getGoodStudent();}else if(choose==4){geteachgrade();}}2、多种基本内排序方法的实现(1)问题描述教材中关于排序的方法介绍了许多种,如果不深刻理解它们的排序思想,实际应用中非常容易混淆,不易于在算法设计中灵活运用。

实验六 内排序

实验六内排序一、实验目的和要求通过本次实验,掌握线性表几种的常用排序方法。

二、实验内容和原理C语言结构化程序设计思想,数组的应用。

三、主要仪器设备装有Visual C++/Turbo C++等C程序编译软件的计算机。

四、实验中程序的源码1. 直接插入排序算法程序代码如下:#include <stdio.h>#include "table.h"/*****************************************//* 函数功能:建立待排序的初始数据*//* 函数参数:指针变量t *//* 函数返回值:空*//* 文件名:init.c 函数名:init() *//*****************************************/void init(table *t){int x;t->length=0;/*初始化*/printf("请输入待排序数据的排序码(-999结束):\n");scanf("%d",&x);/*从键盘输入数据*/while(x!=-999) /*假设输入数据为-999则输入结束*/{t->length++;t->r[t->length].key=x;scanf("%d",&x);}}/*除通过键盘接受数据外,也可以通过从数据文件中等方式接受数据*//*这里仅对待排序记录的排序码进行了输入,记录的其他数据没有输入*//*这里假设接受的数据总数不会超过MAXSIZE个,所以没有进行判断是否溢出*//*****************************************//* 函数功能:输出数据*//* 函数参数:结构变量t *//* 函数返回值:空*//* 文件名:display.c 函数名:display() *//*****************************************/void display(table t){int i;for(i=1;i<=t.length;i++) printf("%5d",t.r[i].key);}/********************************************//* 函数功能:直接插入排序算法*//* 函数参数:结构类型table的指针变量tab *//* 函数返回值:空*//* 文件名insesort, 函数名insertsort() *//********************************************/void insertsort(table *tab){int i,j;for(i=2;i<=tab->length;i++)/*依次插入从第2个开始的所有元素*/{j=i-1;tab->r[0]=tab->r[i];/*设置哨兵,准备找插入位置*/while(tab->r[0].key<tab->r[j].key) /*找插入位置并后移*/{tab->r[j+1]=tab->r[j]; /*后移*/j=j-1; /*继续向前(左)查找*/}tab->r[j+1]=tab->r[0]; /*插入第i个元素的副本,即前面设置的哨兵*/ }}void main(){table T;init(&T);insertsort(&T);display(T);printf(“\n”);}2. 直接选择排序算法程序代码如下:#include <stdio.h>#include "table.h"/*****************************************//* 函数功能:建立待排序的初始数据*//* 函数参数:指针变量t *//* 函数返回值:空*//* 文件名:init.c 函数名:init() *//*****************************************/void init(table *t){int x;t->length=0;/*初始化*/printf("请输入待排序数据的排序码(-999结束):\n");scanf("%d",&x);/*从键盘输入数据*/while(x!=-999) /*假设输入数据为-999则输入结束*/{t->length++;t->r[t->length].key=x;scanf("%d",&x);}}/*除通过键盘接受数据外,也可以通过从数据文件中等方式接受数据*//*这里仅对待排序记录的排序码进行了输入,记录的其他数据没有输入*//*这里假设接受的数据总数不会超过MAXSIZE个,所以没有进行判断是否溢出*//*****************************************//* 函数功能:输出数据*//* 函数参数:结构变量t *//* 函数返回值:空*//* 文件名:display.c 函数名:display() *//*****************************************/void display(table t){int i;for(i=1;i<=t.length;i++) printf("%5d",t.r[i].key);}/**************************************************//* 函数功能:直接选择排序算法*//* 函数参数:结构类型table的指针变量tab *//* 函数返回值:空*//* 文件名:selesort.c 函数名:simpleselectsort() *//**************************************************/void simpleselectsort(table *tab){int i,j,k;for(i=1;i<=tab->length-1;i++) /*每次选择一个最小的元素(的位置),和第i个元素交换*/{k=i; /*记下当前最小元素的位置*/for(j=i+1;j<=tab->length;j++) /*向右查找更小的元素*/if(tab->r[j].key<tab->r[k].key) k=j; /*修改当前最小元素的位置*/if(k!=i) /*如果第i次选到的最小元素位置k不等于i,则将第k、i个元素交换*/{tab->r[0]=tab->r[k]; /*以没有用到的第0个元素作为中间单元进行交换*/tab->r[k]=tab->r[i];tab->r[i]=tab->r[0];}}}void main(){table T;init(&T);simpleselectsort(&T);display(T);printf("\n");}3. 冒泡排序算法程序代码如下:#include <stdio.h>#include "table.h"/*****************************************//* 函数功能:建立待排序的初始数据*//* 函数参数:指针变量t *//* 函数返回值:空*//* 文件名:init.c 函数名:init() *//*****************************************/void init(table *t){int x;t->length=0;/*初始化*/printf("请输入待排序数据的排序码(-999结束):\n");scanf("%d",&x);/*从键盘输入数据*/while(x!=-999) /*假设输入数据为-999则输入结束*/{t->length++;t->r[t->length].key=x;scanf("%d",&x);}}/*除通过键盘接受数据外,也可以通过从数据文件中等方式接受数据*//*这里仅对待排序记录的排序码进行了输入,记录的其他数据没有输入*//*这里假设接受的数据总数不会超过MAXSIZE个,所以没有进行判断是否溢出*//*****************************************//* 函数功能:输出数据*//* 函数参数:结构变量t *//* 函数返回值:空*//* 文件名:display.c 函数名:display() *//*****************************************/void display(table t){int i;for(i=1;i<=t.length;i++) printf("%5d",t.r[i].key);}/**************************************************//* 函数功能:冒泡排序算法*//* 函数参数:结构类型table的指针变量tab *//* 函数返回值:空*//* 文件名:bubbsort.c 函数名:bubblesort () *//**************************************************/void bubblesort(table *tab){int i,j,done;i=1;done=1;while(i<tab->length&&done) /*最多进行tab->length次冒泡,如没有发生交换则结束*/ {done=0;for(j=1;j<=tab->length-i;j++)if(tab->r[j+1].key<tab->r[j].key)/*相邻两记录的排序码不符合排序要求,则进行交换*/ {tab->r[0]=tab->r[j]; /*以第0个元素作为中间单元进行交换*/tab->r[j]=tab->r[j+1];tab->r[j+1]=tab->r[0];done=1;}i++;}}void main(){table T;init(&T);bubblesort(&T);display(T);printf("\n");}五、实验结果与分析1. 这里写出第一个程序的结果与分析2. 这里写出第一个程序的结果与分析3. 这里写出第一个程序的结果与分析。

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

内部排序
一、实验目的
掌握内部中直接插入排序、堆排序的基本算法;
二、实验内容
对直接插入排序和简单选择排序算法进行关键字比较次数和关键字移动次数的比较。

测试数据可以为几组典型的数据:正序、逆序、乱序。

1、直接插入排序:利用 “顺序查找”实现“在R[1..i-1]中查找R[i]的插入位置” 算法实现要点: 从R[i-1]起向前进行顺序查找,监视哨设置在R[0];
R[0] = R[i]; // 设置“哨兵”
循环结束表明R[i]的插入位置为j +1
R[0]j R[i]
for (j=i-1; R[0].key<R[j].key; --j);
// 从后往前找j=i-1插入位置对于在查找过程中找到的那些关键字不小于
R[i].key 的记录,并在查找的同时实现记录向后
移动;
for (j=i-1; R[0].key<R[j].key; --j);
R[j+1] = R[j]
R[0]j R[i]
j= i-1
上述循环结束后可以直接进行“插入”
插入位置
令i = 2,3,…, n,
实现整个序列的排序。

for ( i=2; i<=n; ++i )
if (R[i].key<R[i-1].key)
{ 在R[1..i-1]中查找R[i]的插入位置;
插入R[i] ;
}
void InsertionSort(SqList &L) {
// 对顺序表 L 作直接插入排序。

for ( i=2; i<=L.length; ++i )
if (L.r[i].key < L.r[i-1].key) {
L.r[0] = L.r[i]; // 复制为监视哨
for ( j=i-1; L.r[0].key < L.r[j].key; -- j )
L.r[j+1] = L.r[j]; // 记录后移
L.r[j+1] = L.r[0]; // 插入到正确位置
}
}//InsertSort
算法分析:
实现内部排序的基本操作有两个:(1)“比较”关键字的大小;(2)“移动”记录。

对于直接插入排序:
最好的情况(关键字在记录序列中顺序有序):
“比较”的次数:最坏的情况(关键字在记录序列中逆序有序):
“比较”的次数:112-=
∑=n n i 0
2)1)(4()1(2
-+=+∑=n n i n
i “移动”的次数:
“移动”的次数:
2)1)(2()(2-+=∑=n n i n i 因此,直接插入排序的时间复杂度为O(n 2)
C语言代码
/*直接插入排序*/
void insertSort(int list[], int n)
{
int i = 1, j = 0, node = 0, count = 1;
printf("对序列进行直接插入排序:\n");
printf("初始序列为:");
printList(list, n);
for(i = 2; i <= n; i++)
{
node = list[i];
j = i - 1;
while(j >= 0 && node < list[j])
{
list[j+1] = list[j];
--j;
}
list[j+1] = node;
printf("第%d次排序结果:", count++);
printList(list, n);
}
}
输入待排序序列:23 65 74 13 45 79 31 26 86 98 34(以输入一个字符作为结束)直接插入排序运行结果
2、堆排序
堆的定义:堆是满足下列下列性质的数列{r1, r2, …,rn}:
小顶堆: 或大顶堆:
堆排序即是利用堆的特性对记录序列进行排序的一种排序方法。

算法
void HeapSort ( HeapType &H ) {
// 对顺序表 H 进行堆排序
for ( i=H.length/2; i>0; --i )
HeapAdjust ( H.r, i, H.length ); // 建大顶堆
for ( i=H.length; i>1; --i ) {
H.r[1]←→H.r[i];
// 将堆顶记录和当前未经排序子序列
// H.r[1..i]中最后一个记录相互交换
HeapAdjust(H.r, 1, i-1); // 对 H.r[1] 进行筛选
}
} // HeapSort
堆排序的时间复杂度分析:
1. 对深度为 k 的堆,“筛选”所需进行的关键字比较的次数至多为2(k-1);
2. 对 n 个关键字,建成深度为h (=⎣log2n ⎦+1)的堆,所需进行的关键字比较的次数至多 4n ;
3. 调整“堆顶” n-1 次,总共进行的关键字比较的次数不超过
2 (⎣log2(n-1)⎦+ ⎣log2(n-2)⎦+ …+log22) < 2n (⎣log2n ⎦)
因此,堆排序的时间复杂度为O(n log n )。

C 语言代码
/*堆排序*/
void heapAdjust(int list[], int u, int v)
{
int i = u, j , temp = list[i];
j = 2 * i;
while (j <= v)
{
if(j < v && list[j] < list[j+1])
j++; /*若右孩子较大,则把j 修改为右孩子的下标*/
if(temp < list[j])
{
list[i] = list[j]; /*将list[j]调到父亲的位置上*/ i = j;
j = 2 * i; /*修改i 和j 的值,以便继续向下筛选*/
}
else
break; /*筛选完成,终止循环*/ ⎩⎨⎧≤≤+122i i i i r r r r ⎩⎨⎧≥≥+122i i i i r
r r r
}
list[i] = temp; /*被筛结点的值放入最终位置*/
}
输入待排序序列:23 65 74 13 45 79 31 26 86 98 34(以输入一个字符作为结束)堆排序运行结果。

相关文档
最新文档