排序C++程序实验报告
4各种排序方法C#窗体实验报告

数据结构课程设计报告各种排序方法的C#程序设计目录一、实验目的及要求 (1)二、程序介绍 (1)三、实验步骤 (4)(一)设计窗体基本结构 (4)1、主窗体 (4)2、子窗体 (5)(二)代码编写 (5)1、数据输入 (5)2、排序方法 (5)3、排序结果及算法的输出 (8)四、实验总结 (9)一、实验目的及要求使用Microsoft visual studio C#2010设计一个可以完成使用各种排序方法对数据进行排序的窗体程序二、程序介绍在“排序”窗口文本框中输入需要排序的数据,根据需要采用的排序方法选择单选按钮,点击“查看排序结果及算法”按钮,可在另一窗口“排序结果及算法”中查看排序结果及算法内容,如下图所示:例如:输入数据选择“插入排序”输入数据选择“希尔排序”输入数据选择“冒泡排序”输入数据选择“快速排序”三、实验步骤(一)设计窗体基本结构1、主窗体设置该窗体来输入需要排序的数字和选择排序方法,将该窗体命名为“排序”,并设置文本框以录入数据,运用单选按钮来选择排序方法,设置两个标签以说明文本框和单选按钮的意义,设置两个按钮来跳转到另一窗体和退出程序,并分别命名为“查看排序结果及算法”和“退出”。
如下图所示:2、子窗体设置该窗体来排序结果及算法,将该窗体命名为“排序结果及算法”,并设置文本框以输出排序结果,设置富文本框显示算法内容,设置两个标签以说明文本框及富文本框的意义,如下图所示:(二)代码编写1、数据输入点击按钮“查看排序结果及算法”时先用一个数组记录文本框中输入的数据代码如下:2、排序方法点击按钮“查看排序结果及算法”时根据不同的单选按钮采用不同的排序方法,排序后用一个字符型变量记录下排序结果,并跳转到另一窗体,“退出”按钮退出程序。
代码如下:希尔排序冒泡排序一个字符型变量记录下排序结果,并跳转到另一窗体“退出”按钮3、排序结果及算法的输出在文本框中输出排序结果,将各种算法的内容分别存在不同的txt文件中,在富文本框根据不同的排序结果显示不同算法,“返回”按钮返回前一窗体。
c语言实验报告八

c语言实验报告八C语言实验报告八引言C语言是一种高级编程语言,广泛应用于软件开发和系统编程。
通过学习C语言,我们可以掌握基本的编程概念和技巧,提高自己的编程能力。
本实验报告将介绍C语言实验的第八次实验内容和实验结果。
实验目的本次实验的目的是进一步熟悉C语言的函数和指针的使用,加深对C语言的理解。
通过实际操作,掌握函数的定义和调用、指针的基本概念以及指针和数组之间的关系。
实验内容本次实验的主要内容是编写一个程序,实现对一个整型数组的排序。
具体步骤如下:1. 定义一个整型数组,并初始化数组元素。
2. 编写一个函数,用于对数组进行排序。
可以选择任意一种排序算法,如冒泡排序、插入排序或选择排序等。
3. 在主函数中调用排序函数,并输出排序后的结果。
实验步骤1. 首先,我们需要定义一个整型数组,并初始化数组元素。
可以选择手动输入数组元素,或者通过随机数生成数组元素。
2. 接下来,我们需要编写排序函数。
这个函数接收一个整型数组和数组的长度作为参数,然后对数组进行排序。
我们可以选择冒泡排序算法来实现这个函数。
3. 在主函数中,我们调用排序函数,并输出排序后的结果。
可以使用循环语句遍历数组,并使用printf函数输出数组元素。
实验结果经过编写和调试,我们成功实现了对整型数组的排序。
下面是一个示例输出:原始数组:[5, 2, 9, 1, 7]排序后的数组:[1, 2, 5, 7, 9]讨论与总结通过本次实验,我们进一步熟悉了C语言的函数和指针的使用。
函数的定义和调用是C语言编程的基础,掌握好函数的使用对于编写复杂的程序非常重要。
指针是C语言的特有概念,通过指针可以实现对内存的直接访问和操作,提高程序的效率和灵活性。
在本次实验中,我们使用指针来传递数组参数,实现对数组的排序。
这种利用指针和数组的结合使用,是C语言编程中常见的技巧。
在实际编程中,我们还可以进一步优化排序算法,提高程序的效率。
冒泡排序算法虽然简单易懂,但是时间复杂度较高,不适用于大规模数据的排序。
排序算法实验报告

排序算法实验报告(内部排序算法比较)主要实验内容:对各种内部排序算法进行比较要求:(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个元素的数据测试了这五种排序, 并记录了交换和比较次数, 从这些比较次数中看出每种排序的效率和快慢。
排序编程实验报告心得

一、实验背景随着计算机科学的发展,算法在计算机科学中扮演着至关重要的角色。
排序算法作为算法家族中的一种,其重要性不言而喻。
本实验旨在通过编写排序算法,加深对排序算法原理的理解,提高编程能力,并学会如何分析算法的效率。
二、实验目的1. 理解常见的排序算法原理;2. 掌握至少两种排序算法的编程实现;3. 分析排序算法的效率,比较不同排序算法的性能;4. 提高编程能力和算法思维能力。
三、实验内容本次实验主要涉及以下几种排序算法:1. 冒泡排序(Bubble Sort)2. 选择排序(Selection Sort)3. 插入排序(Insertion Sort)4. 快速排序(Quick Sort)5. 归并排序(Merge Sort)四、实验过程1. 冒泡排序冒泡排序是一种简单的排序算法,其基本思想是通过相邻元素的比较和交换,将较大的元素逐步移动到数组的末尾。
具体步骤如下:(1)从数组的第一个元素开始,比较相邻的两个元素,如果它们的顺序错误就把它们交换过来;(2)对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。
这步做完后,最后的元素会是最大的数;(3)针对所有的元素重复以上的步骤,除了最后已经排序好的元素;(4)重复步骤(1)~(3),直到排序完成。
2. 选择排序选择排序的基本思想是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
3. 插入排序插入排序的基本思想是:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。
具体步骤如下:(1)从第一个元素开始,该元素可以认为已经被排序;(2)取下一个元素,在已排序的元素序列中从后向前扫描;(3)如果该元素(已排序)大于新元素,将该元素移到下一位置;(4)重复步骤(3),直到找到已排序的元素小于或者等于新元素的位置;(5)将新元素插入到该位置后;(6)重复步骤(2)~(5)。
排序编程实验报告

printf("*");
printf("\n");
}ቤተ መጻሕፍቲ ባይዱ
printf("\n输入回车进行排序\n");
getchar();
for(i=0; i<20; ++i)
{
printf("[%2d] %2d ", i, rArray[19-i]);
for(j=1; j<=rArray[19-i]; ++j)
printf("*");
printf("\n");
}
return 0;
}
运行结果:
数据处理分析:
1、要注意数组下标与元素的对应,即数组下标应该减一
2、程序中使用了随机生成函数,应包含其头文件
3、利用getchar()可实现用回车键控制程序的执行
4、对数组的输出应该利用for循环对元素进行逐个输出
深圳大学学生实验报告用纸
深 圳大 学 实 验 报 告
课程名称:高级语言程序设计
实验项目名称:
学院:信息工程学院
专业:
********
报告人:学号:班级:
实验时间:2013/4/27
实验报告提交时间:2013/5/6
教务部制
实验目的与要求:
一、进一步掌握C语言中的选择结构、循环控制的编程方法;
二、学习C语言中的数组定义和引用的编程方法;
for(j=i; j<20; ++j)
if(rArray[i] < rArray[j])
快速排序算法实验报告

快速排序算法实验报告快速排序算法实验报告引言快速排序算法是一种高效的排序算法,它的时间复杂度为O(nlogn),在实际应用中被广泛使用。
本实验旨在通过实际的实验数据,验证快速排序算法的效果和性能,并对其进行分析和总结。
实验设计本实验采用C++语言编写快速排序算法,并通过随机生成的数据进行排序实验。
实验中使用了不同规模的数据集,并记录了排序所需的时间和比较次数。
实验步骤1. 实现快速排序算法快速排序算法的核心思想是通过选取一个基准元素,将待排序的序列分为两部分,一部分比基准元素小,一部分比基准元素大,然后对这两部分继续进行快速排序。
具体实现时,可以选择序列的第一个元素作为基准元素,然后使用分治法递归地对子序列进行排序。
2. 生成测试数据为了验证快速排序算法的性能,我们生成了不同规模的随机数序列作为测试数据。
测试数据的规模分别为1000、10000、100000和1000000。
3. 进行排序实验使用生成的测试数据,对快速排序算法进行实验。
记录每次排序所需的时间和比较次数,并将结果进行统计和分析。
实验结果通过对不同规模的数据集进行排序实验,我们得到了以下结果:数据规模排序时间(ms)比较次数1000 2 872810000 12 114846100000 124 13564771000000 1483 15737267分析与讨论从实验结果可以看出,随着数据规模的增大,排序所需的时间和比较次数也呈指数级增长。
这符合快速排序算法的时间复杂度为O(nlogn)的特性。
另外,通过观察实验结果,我们可以发现快速排序算法的性能受到多个因素的影响。
首先,基准元素的选择对算法的效率有很大的影响。
如果选择的基准元素恰好是序列的中位数,那么排序的效率会更高。
其次,数据的初始顺序也会影响排序的效果。
如果数据已经是有序的,那么快速排序算法的效率将大大降低。
此外,快速排序算法还存在一些优化的空间。
例如,可以通过随机选择基准元素来避免最坏情况的发生。
字符数组排序实验报告
一、实验目的1. 熟悉字符数组的定义和操作。
2. 掌握字符数组的排序方法。
3. 提高编程能力和逻辑思维能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发工具:Visual Studio 2019三、实验内容1. 创建一个字符数组,包含10个字符。
2. 使用冒泡排序算法对字符数组进行排序。
3. 输出排序后的字符数组。
四、实验步骤1. 创建一个字符数组,包含10个字符。
```c#include <stdio.h>#include <string.h>int main() {char arr[10] = {'b', 'a', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}; int i, j;// 省略排序和输出代码return 0;}2. 使用冒泡排序算法对字符数组进行排序。
```cvoid bubbleSort(char arr[], int len) {for (i = 0; i < len - 1; i++) {for (j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j + 1]) {char temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}```3. 输出排序后的字符数组。
```cvoid printArray(char arr[], int len) {for (i = 0; i < len; i++) {printf("%c ", arr[i]);}printf("\n");}4. 将排序和输出代码整合到main函数中。
c++快速排序实验心得
c++快速排序实验心得一、前言快速排序(Quicksort)是一种常见的排序算法,其原理是通过分治的思想将待排序数组按照一个基准值(pivot)分为左右两个子数组,然后对子数组进行递归排序,最终合并得到有序数组。
快速排序的平均时间复杂度为O(nlogn),在实际应用中具有较高的效率和广泛的应用。
二、实验设计本次实验旨在通过编写C++程序实现快速排序算法,并进行实验验证。
实验主要分为以下几个步骤:1.设计快速排序算法的具体实现:包括选择基准值、划分子数组和递归调用等步骤。
2.编写C++程序实现快速排序算法,并进行简单的功能测试。
3.设计实验方案,生成不同规模的随机数组作为待排序数组,并记录排序算法的比较次数和交换次数。
4.进行实验的多次重复,并对数据进行分析和总结。
三、实验过程1.算法实现在实现快速排序算法时,首先需要选择一个基准值。
实验中采用了最常见的方式,即选择数组中的某一元素作为基准值。
然后通过遍历数组,将比基准值小的元素放到基准值的左边,将比基准值大的元素放到右边。
最后递归地对左右两个子数组进行排序。
2. C++程序实现在编写C++程序实现快速排序算法时,需要定义递归函数来实现对子数组的排序。
利用C++的函数重载机制,将数组的起始位置和结束位置作为参数传入函数。
在函数中,通过递归调用来实现对子数组的排序操作。
此外,还需要记录比较次数和交换次数,在每一次比较或交换操作完成后进行更新。
3.实验方案设计为了验证快速排序算法的性能,本次实验生成了不同规模(100、1000、10000)的随机数组作为待排序数组。
为了保证实验的公正性和可重复性,每个规模的数组重复进行了十次排序实验。
在每次实验中,记录比较次数和交换次数,并计算其平均值。
4.实验过程及结果在实验过程中,逐步增加数组规模,即先进行100个元素的排序,然后是1000个元素的排序,最后是10000个元素的排序。
使用C++的时间库对排序算法的执行时间进行测量,并记录比较次数和交换次数。
查找和排序实验报告
查找和排序实验报告
本实验主要针对以查找、排序算法为主要实现目标的软件开发,进行实验室研究。
实
验包括:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序,
以及折半查找算法。
实验采用C语言编写,在完成以上排序以及查找方法的基础上,针对实验的工程要求,进行了性能分析,分析了算法空间复杂度以及时间复杂度。
通过首先采用循环方式,构建未排序数组,在此基础上,调用算法实现查找和排序。
也对不同算法进行对比分析,将数据量在100个至30000个之间进行测试。
结果表明:快速排序与希尔排序在时间复杂度方面具有最好的表现,而冒泡排序和选
择排序时间复杂度较高。
在空间复杂度方面,基数排序表现最佳,折半查找的空间复杂度
则比较可观。
在工程应用中,根据对不同排序算法的研究,可以更准确、有效地选择正确的算法实现,有效应用C语言搭建软件系统,提高软件应用效率。
(建议加入算法图)
本实验结束前,可以得出结论:
另外,也可以从这些研究中发现,在使用C语言实现软件系统时,应该重视算法支持
能力,以提高软件应用效率。
由于查找和排序算法在软件应用中占有重要地位,此次实验
对此有贡献,可为未来开发提供支持。
数据结构实验报告(C语言)顺序表__排序
int i,j,n,x,change; n=L->length; change=1; for(i=1;i<=n-1 && change;++i){
change=0; for(j=1;j<=n-i-1;++j)
if(L->r[j] > L->r[j+1]){ x=L->r[j]; L->r[j]=L->r[j+1]; L->r[j+1]=x; change=1;
void QuickSort(SqeList *L,int low,int high){ int mid; if(low<high){ mid=Partition(L,low,high); QuickSort(L,low,mid-1); QuickSort(L,mid+1,high); }
}
//直接选择排序
printf("\n7-直接选择排序结果为:\n"); SelectSort(&l); PrintList(&l); printf("\n"); printf("\n8-二路归并结果为:\n"); MergeSort(&l);
PrintList(&l); printf("\n"); } else printf("请输入大于 0 的值: "); return 0; }
} else{
MR->r[k]=R->r[j]; ++j; } ++k; } while(i<=mid) MR->r[k++]=R->r[i++]; while(j<=high) MR->r[k++]=R->r[j++]; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告实验名称:实验四——排序学生姓名:班级:班内序号:学号:日期:1.实验要求使用简单数组实现下面各种排序算法,并进行比较。
排序算法:1、插入排序2、希尔排序3、冒泡排序4、快速排序5、简单选择排序6、堆排序(选作)7、归并排序(选作)8、基数排序(选作)9、其他要求:1、测试数据分成三类:正序、逆序、随机数据2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。
3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)4、对2和3的结果进行分析,验证上述各种算法的时间复杂度编写测试main()函数测试线性表的正确性。
2. 程序分析插入排序类似于玩纸牌时整理手中纸牌的过程,它的基本方法是寻找一个指定元素在待排序元素中的位置,然后插入。
直接插入排序的基本思想可以这样描述:每次讲一个待排序的元素按其关键码的大小插入到一个已经排序好的有序序列中,直到全部元素排序好。
元素个数为1时必然有序,这就是初始有序序列;可以采用顺序查找的方法查找插入点,为了提高时间效率,在顺序查找过程中边查找边后移的策略完成一趟插入。
希尔排序又称“缩小增量排序”,是对直接插入排序的一种改进,它利用了直接插入的两个特点:1.基本有序的序列,直接插入最快;2.记录个数很少的无序序列,直接插入也很快。
希尔排序的基本思想为:将待排序的元素集分成多个子集,分别对这些子集进行直接插入排序,待整个序列基本有序时,再对元素进行一次直接插入排序。
冒泡排序的基本思想是:两两比较相邻的元素,如果反序,则交换位置,直到没有反序的元素为止。
具体的排序过程是:将整个待排序元素划分成有序区和无序区,初始状态有序区为空,无序区包括所有待排序的元素;对无序区从前向后依次将相邻元素的关键码进行比较,若反序则交换,从而使得关键码小的元素向前移,关键码大的元素向后移;重复执行前一个步骤,直到无序区中没有反序的元素。
快速排序元素的比较和移动是从两端向中间进行的。
快速排序的基本思想是:在分区中选择一个元素作为轴值,将待排序元素划分成两个分区,使得左侧元素的关键码均小于或等于轴值,右侧元素的关键码均大于或等于轴值,然后分别对这两个分区重复上述过程,直到整个序列有序。
简单选择排序的基本思想是:第1趟,在待排序记录r[1…n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2…n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟,在待排序记录r[i…n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。
2.1 存储结构2.2 关键算法分析1、直接插入排序自然语言描述:(1)将整个待排序的记录划分成有序区和无序区。
有序区为待排序记录的第一个记录,无序区为所有剩余带待排序记录。
(2)从第二个数据开始依次插入到有序区中,直到所有记录插入完毕。
(3)在r[0]处设置“哨兵”,记为要插入的记录r[i],在自i-1起往前查找的过程中,同时后移记录。
(4)找到插入位置后,将待插入记录插入到有序表中。
(5)重复执行(3)、(4),直到无序区中没有记录。
伪代码描述:1.初始化比较次数Cnum=0,移动次数Mnum=02.for(int i=2;i<n;i++)2.1比较次数++2.2 if(r[i]<r[i-1])2.2.1设置哨兵r[0]=r[i],移动次数++2.2.2 for(j=i-1;r[0]<r[j];j--)2.2.2.1 r[j+1]=r[j]2.2.2.2比较次数++;移动次数++;2.2.3 r[j+1]=r[0],移动次数++时间复杂度:最好情况下,待排序序列为正序,每趟秩序与有序序列的最后一个纪录的关键码比较一次,移动两次记录。
总的比较次数为n-1,记录移动的次数为2(n-1)。
因此,时间复杂度为O(n)。
最坏情况下,待排序序列为逆序,比较次数为(n+2)(n+1)/2,移动次数为(n+4)(n-1)/2因此,时间复杂度为O(n2).平均情况下,总的比较次数为n(n-1)/4,移动次数为(n+4)(n-1)/4,因此,时间复杂度为O(n2)空间复杂度:S(1)直接插入排序只需要一个纪录的辅助空间,用来作为待插入记录的暂存单元和记录的插入位置的过程中的“哨兵”以及交换记录时的暂存单元。
2、希尔排序自然语言描述:(1)假设待排序记录为n个,先取整数d<n,,将所有相距为d的记录构成一组,从而将整个待排序记录分为d个子序列。
(2)对每个子序列分别进行直接插入排序。
在每个子序列中,待插入记录和同一子序列中的前一个记录比较,在插入记录r[i]时,自r[i-d]往前查找待插入位置,在查找过程中,记录后移也是移动d个位置。
(3)当搜索位置j<=0或者r[0]>=r[j],表示插入位置已经找到。
在整个序列中,前d个记录分别是d个子序列的第一个记录,所以从第d+1个记录开始插入。
(4)再缩小d,重复以上步骤,再对每个子序列进行直接插入排序,直到d=1,即将所有记录放在一组进行一次直接插入排序,最终将所有记录重新排序得到有序序列。
伪代码描述:1.初始化比较次数Cnum=0,移动次数Mnum=02.for(int d=n/2;d>=1;d=d/2)2.1 for(int i=d+1;i<n;i++)2.1.1比较次数++2.1.2 if(r[i]<r[i-d])2.1.2.1 r[0]=r[i],移动次数++2.1.2.2 for(j=i-d;i>0&&r[0]<r[j];j=j-d)2.1.2.2.1 r[j+d]=r[j]2.1.2.2.2比较次数++,移动次数++2.1.2.3 r[j+d]=r[0],移动次数++时间复杂度:希尔排序的时间性能分析是一个复杂的问题,因为它是所取增量的函数。
有人在大量实验的基础上指出,希尔排序的时间性能在O(n2)和O(nlog2n)之间,当n在某个特定范围时,希尔排序的时间性能约为O(n1.3)空间复杂度:S(1)希尔排序只需要一个纪录的辅助空间,用于暂存当前待插入的记录。
3、冒泡排序自然语言描述:(1)将整个待排序的记录划分成有序区和无序区,初始有序区为空,无序区包括所有待排序记录。
设置变量pos,此位置之后的所有记录均已经有序。
(2)对无序区从前向后一次将相邻记录的关键码进行比较,若反序则交换,从而使得关键码小的记录前移,关键码大的记录后移。
(3)每趟冒泡排序开始之前,设pos初值为0,在该趟排序过程中,只要有记录的交换,pos就大于0。
通过pos是否为0判断是否有记录的交换,从而判断冒泡排序是否结束。
伪代码描述:1.初始化比较次数Cnum=0,移动次数Mnum=0,int pos=n-12.while(pos!=0)2.1int bound=pos,pos=02.2for(int j=1;j<bound;j++)2.2.1比较次数++2.2.2 if(r[j]>r[j+1])2.2.2.1 r[0]=r[j],r[j]=r[j+1],r[j+1]=r[0]2.2.2.2 pos=j,Mnum+=3时间复杂度:最好情况下,待排序记录序列为正序,算法只执行了一趟,进行了n-1次关键妈的比较,不需要移动记录,时间复杂度为O(n)最坏情况下,待排序记录序列为反序,每趟排序在无序序列中只有一个最大的纪录被交换到最终位置,故算法执行n-1趟,第i趟排序执行了n-1次关键码的比较和n-i次记录的交换,这样,关键码的比较次数为n(n-1)/2,记录的移动次数为3n(n-1)/2。
平均情况下,起泡排序的时间复杂度与最坏情况同数量级。
空间复杂度:S(1)起泡排序只需要一个纪录的辅助空间,用来作为记录交换的暂存单元。
4、快速排序自然语言描述:(1)取第一个记录作为基准,设置两个参数i,j分别用来指示将要与基准记录进行比较的左侧记录位置和右侧记录位置,也就是本次划分的区间。
(2)右侧扫描过程:将基准记录与j指向的记录进行比较,如果j指向记录的关键码大,则j--,重复右侧扫描过程,直到右侧的记录小,即反序,执行r[i]=r[j](3)左侧扫描过程:将基准记录与i指向的记录进行比较,如果i指向记录的关键码大,则i--,重复右侧扫描过程,直到右侧的记录小,即反序,执行r[j]=r[i](4)重复执行(2)、(3),直到i、j指向同一位置。
(5)r[i]=pivot(6)返回i的位置伪代码描述:1.int i=first; int j=end; int pivot=r[i]2.while(i<j)2.1while((i<j)&&(r[j]>=pivot))2.1.1j--;比较次数++2.2r[i]=r[j]2.3if(i<j)2.3.1移动次数++2.4while((i<j)&&(r[i]<=pivot))2.4.1 i++;比较次数++2.5r[j]=r[i]2.6if(i<j)2.6.1移动次数++3.r[i]=pivot4.return i时间复杂度:最好情况下,每次划分对一个记录定位后,该记录的左侧子序列和右侧子序列的长度相同。
在具有n个记录的序列中,对一个记录定位要对整个待划分序列扫描一遍,则所需时间为O(n)。
时间复杂度为O(nlog2n)。
最坏情况下,待排序记录序列正序或逆序,每次划分只得到一个比上一次划分少一个纪录的子序列(另一个子序列为空)。
此时,必须经过n-1次递归调用才能把所有记录定位,而且第i趟划分需要经过n-i次关键码的比较才能找到第i个记录的基准记录,因此总的比较次数为n(n-1)/2,记录的移动次数小于等于比较次数。
因此时间复杂度为O(n2).平均情况下,可以用归纳法证明,其数量级也为O(nlog2n)。
空间复杂度:由于快速排序是递归的,需要一个栈来存放每一层递归调用的必要信息,其最大容量应与递归调用的深度一致,最好情况下为S(nlog2n),最坏情况下,因为要进行n-1次递归调用,所以,栈的深度为S(n),平均情况下,栈的深度为S(log2n)。
5、简单选择排序自然语言描述:(1)将整个记录划分为有序区和无序区,初始有序区为空,无序区包括所有待排序记录。
设置变量index,记录一次比较中关键码最小的位置。
(2)第i趟简单选择排序的待排序区间是r[i]-r[n],首先将index设定为当前无序区的第一个位置,然后用r[index]与无序区中其他记录进行比较,若有比r[index]小的记录,就将index改为这个新的最小的记录的位置。