数据结构实验8排序

时间:2024.3.31

实验八排序

一、实验目的

1. 熟悉掌握教材中所介绍的几种排序方法。

2. 学会分析各种内排序算法的性能 。

二、实验内容

1. 随机产生20位整数

2. 输入序列,编写程序,按下列排序方法将序列从小到大排序并输出。

(1) 冒泡排序

(2) 快速排序

3. 纪录每种方法比较次数和移动次数

三、实验步骤

1、冒泡排序

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较。如此下去,直至最终完成排序。

2、快速排序

(1)基本思想

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

(2)实现方法

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:

1)设置两个变量I、J,排序开始的时候:I=1,J=N-1;

2)以第一个数组元素作为关键数据,赋值给X,即 X=A[0];

3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于X的值,让该值与X交换;

4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于X的值,让该值与X交换;

5)重复第3、4步,直到 I=J;

四、算法说明

首先为了避免产生的随机数过大,我们限定了了随机数为1-100之间,其次我们分别运用函数产生随机数两次,第一次为使用冒泡排序,第二次为使用快速排序。

五、测试结果

六、分析与探讨

在设计中除了注意冒泡排序和快速排序的原理外,还需要注意函数间的套用中出现的形参和实参的类型统一,以及交换两个数值时候,中介参数的使用。

七、附录:源代码

源代码列在附录中,要求程序风格清晰易理解,有充分的注释。有意义的注释行不少于30%。

#include"stdio.h"

#include"time.h"

#include"stdlib.h"

#include"iostream"

using namespace std;

void QuickSort(int p[], int start, int end)

{

if (start >= end)

{

return;

}

int i=0, j=0, tmp=0;

i = start;

j = end-1;

do

{

while(p[i] < p[end])

{

i++;

}

while(p[j] >= p[end])

{

j--;

}

if (i

{

tmp = p[i];

p[i] = p[j];

p[j] = tmp;

}

else

{

tmp = p[i];

p[i] = p[end];

p[end] = tmp;

}

}

while(i

QuickSort(p, start, i-1);

QuickSort(p, i+1, end);

}

void PrintArrary(int data[], int size)

{

for (int i=0; i

{

cout <

}

cout<

}

void main()

{

int a[20],i,j,t,flag;

int argc[20];

srand((unsigned)time(0));

for(i=0;i<20;i++)

a[i]=rand()%100;

cout<<"随机产生20个100以内的整数"<

for(i=0;i<20;i++)

cout <

for(i=0;i<19;i++) /* 改进型冒泡法排序 */

{

flag=0;

for(j=0;j<20-i-1;j++)

if(a[j]>a[j+1])

{

t=a[j]; /* 交换a[i]和a[j] */

a[j]=a[j+1];

a[j+1]=t;

flag=1;

}

if(flag==0)break;

}

cout<

cout <<"将这20个整数按照冒泡排序进行升序排列"<

for(i=0;i<20;i++)

cout<

cout<

for(i=0;i<20;i++)

argc[i]=rand()%100;

cout<<"再次随机产生20个100以内的整数"<

PrintArrary(argc, 20);

cout<

QuickSort(argc, 0, 19);

cout<<"将这20个整数按照快速排序进行升序排列"<

PrintArrary(argc, 20);

}


第二篇:数据结构实验六 内部排序


实验六

内部排序算法比较

1、实验目的

掌握多种排序方法的基本思想,如直接插入、起泡、简单选择、快速、堆、希尔排序等排序方法,并能够用高级语言实现。

2、问题描述

各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受

3、基本要求

(1) 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。

(2) 待排序的表长不小于100;其中的数据要用伪随机数产生程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)。

(3) 最后要对结果作出简单分析,包括对各组数据得出结果波动大小的解释。

4、测试数据

由随机数产生器生成。

5、实现提示

主要工作是设法在已知算法中的适当位置插入对关键字的比较次数和移动次数的计数操作。程序还可以考虑几组数据的典型性,如,正序、逆序和不同程度的乱序。注意采用分块调试的方法。

6、源程序

#include

#include

#include

#define MAXNUM 10000

long cn[MAXNUM],mn[MAXNUM];

typedef struct

{

int key;

}datatype;

void D_InsertSort(datatype R[],long n)//直接排序

{

long i ,j;

for(i=2;i<=n;i++)

{

cn[0]++;

if(R[i].key

{

R[0]=R[i];mn[0]++;

for(j=i-1;R[0].key

R[j+1]=R[j];

R[j+1]=R[0];

mn[0]+=2;

}

}

}

void Select_Sort(datatype R[],long n)//简单选择排序

{

long i,j,k;

for(i=1;i

{

k=i;

for(j=i+1;j<=n;j++)

{

cn[1]++;

if(R[j].key

k=j;

}

if(i=k)

{

R[0]=R[k];

R[k]=R[i];

R[i]=R[0];

mn[1]+=3;

}

}

}

void Bubble_Sort(datatype R[],long n)//冒泡排序

{

long i,j;

for(i=1;i

{

for(j=1;j<=n-i;j++)

{

cn[2]++;

if(R[j].key

{

R[0]=R[j];

R[j]=R[j+1];

R[j+1]=R[0];

mn[2]+=3;

}

}

}

}

void HeapAdjust(datatype R[], long s, long t)//堆调整

{

datatype rc;

long i,j;

rc=R[s];

i=s;

for(j=2*i;j<=t;j=2*j)

{

cn[3]++;

if(j

j=j+1;

if(rc.key>R[j].key)

break;

R[i]=R[j];

mn[3]++;

i=j;

}

R[i]=rc;

}

void HeapSort(datatype R[], long n)//推排序

{

long i;

for(i=n/2;i>0;i--)

HeapAdjust(R,i,n);

for(i=n;i>1;i--)

{

R[0]=R[1];

R[1]=R[i];

R[i]=R[0];

mn[3]+=3;

HeapAdjust(R,1,i-1);

}

}

void Merge(datatype R[],datatype R1[], long s, long m, long t)

{

long i ,j ,k;

i=s;j=m+1;k=s;

while(i<=m&&j<=t)

{

cn[4]++;

if(R[i].key

{

R1[k++]=R[i++];

mn[4]++;

}

else

{

R1[k++]=R[j++];

mn[4]++;

}

}

while(i<=m)

{

R1[k++]=R[i++];

mn[4]++;

}

while(j<=t)

{

R1[k++]=R[j++];

mn[4]++;

}

}

void MSort(datatype R[],datatype R1[], long s,long t)

{

long m;

if(s==t)

{

R1[s]=R[s];

mn[4]++;

}

else{

m=(s+t)/2;

MSort(R,R1,s,m);

MSort(R,R1,m+1,t);

Merge(R1,R,s,m,t);

}

}

void MergeSort(datatype R[],datatype R1[],long n)//归并排序

{

MSort(R,R1,1,n);

}

long Partition(datatype R[], long low, long high)

{

R[0]=R[low];

mn[5]++;

while(low

{

while(low=R[0].key)

{

cn[5]++;high--;

}

if(low

{

R[low]=R[high];

low++;

mn[5]++;

}

while(low

{

cn[5]++;

low++;

}

if(low

{

R[high]=R[low];

high--;

mn[5]++;

}

}

R[low]=R[0];

mn[5]++;

return low;

}

void Quick_Sort(datatype R[],long s, long t)//快速排序

{

long i;

if(s

{

i=Partition(R,s,t);

Quick_Sort(R,s,i-1);

Quick_Sort(R,i+1,t);

}

}

void prin(datatype R[], long n)

{

long i;

printf("排序结果为 :\n");

for(i=1;i<=n;i++)

{

printf("%d ",R[i]);

}

printf("\n");

}

void suiji()

{

long i,n;

datatype R[MAXNUM]={0};////定义结构数组

printf("请输入你要输入d个数\n");

scanf("%d",&n);

if(n>500000)

{

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

scanf("%d ",&n);

}

for(i=1;i<=n;i++)

R[i].key=rand()%1000;

printf("排序前的元素顺序\n");

for(i=1;i

{

printf("%d ",R[i].key);

}

printf("\n");

D_InsertSort(R,n);//直接排序

Select_Sort(R,n);//简单选择排序

Bubble_Sort(R,n);//冒泡排序

HeapSort(R,n); //推排序

datatype R2[MAXNUM]={0};

MergeSort(R,R2,n);

Quick_Sort(R,0,n);//快速排序

prin(R,n);

}

int main()

{ suiji();

printf(" 比较结果 \n");

printf(" 排序方式 比较次数 移动次数\n");

printf(" 直接 %d %d \n",cn[0],mn[0]);

printf(" 简单选择 %d %d \n",cn[1],mn[1]);

printf(" 冒泡 %d %d \n",cn[2],mn[2]);

printf(" 推排序 %d %d \n",cn[3],mn[3]);

printf(" 快速排序 %d %d \n",cn[5],mn[5]);

return 0;

}

7、总结:

理论分析可以得出各种排序算法的时间复杂度和空间复杂度,如下

更多相关推荐:
《数据结构》实验报告——排序

数据结构实验报告排序实验题目输入十个数从插入排序快速排序选择排序三类算法中各选一种编程实现实验所使用的数据结构内容及编程思路1插入排序直接插入排序的基本操作是将一个记录到已排好序的有序表中从而得到一个新的记录增...

数据结构排序实验报告

数据结构课程设计报告实验五排序一需求分析本演示程序用C60编写完成各种排序的实现对输入的一组数字实现不同的排序方法对其由小到大顺序输出1分别对直接插入排序希尔排序冒泡排序快速排序选择排序堆排序算法进行编写2对存...

数据结构排序算法实验报告

数据结构课程设计报告

数据结构实验报告——排序

1实验要求实验目的学习实现对比各种排序算法掌握各种排序算法的优劣以及各种算法使用的情况实验内容使用简单数组实现下面各种排序算法并进行比较排序算法1插入排序2希尔排序3冒泡排序4快速排序5简单选择排序6堆排序选作...

数据结构快速排序实验报告

一问题描述在操作系统中我们总是希望以最短的时间处理完所有的任务但事情总是要一件件地做任务也要操作系统一件件地处理当操作系统处理一件任务时其他待处理的任务就需要等待虽然所有任务的处理时间不能降低但我们可以安排它们...

数据结构 内排序实验报告

通达学院实验报告20xx20xx学年第2学期课程名称数据结构实验名称基本内排序算法的验证和性能比较专业软件工程学生姓名班级学号10003102指导教师陈蕾日期20xx年5月29日南京邮电大学通达学院

数据结构实验报告八-快速排序

实验8快速排序1需求分析1输入的形式和输入值的范围第一行是一个整数n代表任务的件数接下来一行有n个正整数代表每件任务所用的时间中间用空格或者回车隔开不对非法输入做处理及假设用户输入都是合法的2输出的形式输出有n...

数据结构实验报告十四—基数排序

问题描述基数排序是采用分配与收集的办法用对多关键码进行排序的思想实现对单关键码进行排序的方法实现多关键码排序有两种常用的方法1最高位优先MSDMostSignificantDigitfirst2最低位优先LSD...

数据结构排序实验报告

数据结构实验排序姓名陆孟飞学号1219xx29需求分析本演示程序用C60编写完成排序的实现对输入的一组数字实现不同的排序方法对其由小到大顺序输出1分别对直接插入排序希尔排序冒泡排序快速排序选择排序堆排序算法进行...

数据结构-实验报告内排序+

封面学生实验报告学院国际经贸学院课程名称数据结构专业班级09电子商务姓名学号学生实验报告经管类专业用一实验目的及要求1目的掌握内排序的方法2内容及要求实验题101编写一个程序实现直接插入排序算法并输出98765...

数据结构 实验报告 排序

实验报告实验目的1掌握各种排序方法的排序过程2了解一些排序算法的实现实验内容学生的考试成绩表由学生的学号姓名和成绩组成设计一个程序对给定的n个学生信1按分数高低排序打印出每个学生在考试中的排名分数相同的为同一名...

应用数据结构实验报告

学生实验报告书实验课程名称开课学院指导教师姓名学生姓名学生专业班级学生学号应用数据结构管理学院20xx20xx学年第2学期1实验四2345678910111213

数据结构排序实验报告(34篇)