当前位置:文档之家› 排序实验报告

排序实验报告

实验五排序

实验目的: 掌握几种排序的思想及算法

问题分析:

(一)直接插入排序

1. 排序思想

将待排序的记录Ri,插入到已排好序的记录表R1, R2 ,…., Ri-1中,得到一个新的、记录数增加1的有序表。直到所有的记录都插入完为止。

设待排序的记录顺序存放在数组R[1…n]中,在排序的某一时刻,将记录序列分成两部分:

◆R[1…i-1]:已排好序的有序部分;

◆R[i…n]:未排好序的无序部分。

显然,在刚开始排序时,R[1]是已经排好序的。

2 . 算法实现

void straight_insert_sort(Sqlist R)

{ int i, j ;

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

{ R[0]=R[i]; j=i-1; /*设置哨兵*/

while( LT(R[0].key, R[j].key) )

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

j--;

} /* 查找插入位置*/

R[j+1]=R[0]; /* 插入到相应位置*/

}

}

(二)希尔排序

1. 排序思想

①先取一个正整数d1(d1

②取新的增量d2

2. 算法实现

先给出一趟希尔排序的算法,类似直接插入排序。

void shell_pass(Sqlist R, int d)

/* 对顺序表L进行一趟希尔排序, 增量为d */

{ int j, k ;

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

{ R[0]=R[j] ; /* 设置监视哨兵*/

k=j-d ;

while (k>0&<(R[0].key, R[k].key) )

{ R[k+d]=R[k] ; k=k-d ; }

R[k+d]=R[0] ;

}

}

然后在根据增量数组dk进行希尔排序。

void shell_sort(Sqlist R, int dk[], int t)

/* 按增量序列dk[0 … t-1],对顺序表L进行希尔排序*/

{ int m ;

for (m=0; m

shll_pass(R, dk[m]) ;

}

增量序列取法

◆无除1以外的公因子;

◆最后一个增量值必须为1。

(三)简单选择排序

1. 排序思想

基本操作是:通过n-i次关键字间的比较,从n-i+1个记录中选取关键字最小的记录,然后和第i个记录进行交换,i=1, 2, … n-1 。

2. 算法实现

void simple_selection_sort(Sqlist R)

{ int i, j,k;

for (i=1; i

{ k=i ;

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

if ( LT(R[j].key, R[k].key) ) k=j ;

if (k!=i) /* 记录交换*/

{ R[0]=R[k]; R[k]=R[i];

R[i]=R[0];

}

}

}

(四)堆排序

1. 排序思想

①对一组待排序的记录,按堆的定义建立堆;

②将堆顶记录和最后一个记录交换位置,则前n-1个记录是无序的,而最后一个记录是有序的;

③堆顶记录被交换后,前n-1个记录不再是堆,需将前n-1个待排序记录重新组织成为一个堆,然后将堆顶记录和倒数第二个记录交换位置,即将整个序列中次小关键字值的记录调整(排除)出无序区;

④重复上述步骤,直到全部记录排好序为止。

排序过程中,若采用小根堆,排序后得到的是递减序列;若采用大根堆,排序后得到的是递增序列。

堆的调整——筛选

⑴堆的调整思想

输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直到是叶子结点或其关键字值小于等于左、右子树的关键字的值,将得到新的堆。称这个从堆顶至叶子的调整过程为“筛选”,如图10-10所示。

⑵堆调整算法实现

void Heap_adjust(Sqlist R, int low, int high)

/* R[low..high]中记录关键字除R[low].key均满足堆定义*/

/* 调整R[low]的位置使之成为小根堆*/

{ R[0]=R[low] ; /*临时保存调整点R[low] */

for (k=2*low; k<=high; k=k*2)

{ if ((k

k++ ; /* 选择左、右孩子中关键字的最小者*/

if ( LT(R[k].key, R[0].key) )

{ R[j]=R[k] ; low=k ; }

else break ;

}

R[j]=R[0] ;

}

2. 堆的建立

利用筛选算法,可以将任意无序的记录序列建成一个堆,设R[1],R[2], …,R[n]是待排序的记录序列。

将二叉树的每棵子树都筛选成为堆。只有根结点的树是堆。第⌊n/2⌋个结点之后的所有结点都没有子树,即以第⎣n/2⎦个结点之后的结点为根的子树都是堆。因此,以这些结点为左、右孩子的结点,其左、右子树都是堆,则进行一次筛选就可以成为堆。同理,只要将这些结点的直接父结点进行一次筛选就可以成为堆…。只需从第⎣n/2⎦个记录到第1个记录依次进行筛选就可以建立堆。

3.堆排序算法实现

堆的根结点是关键字最小的记录,输出根结点后,是以序列的最后一个记录作为根结点,而原来堆的左、右子树都是堆,则进行一次筛选就可以成为堆。

void Heap_Sort(Sqlist R)

{ int i ;

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

Heap_adjust(R, i , n) ; /*初始建堆*/

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

{ R[0]=R[1] ; R[1]=R[i] ;

R[i]=R[0] ; /* 堆顶与最后一个交换*/

Heap_adjust(R, 1, i-1) ;

}

}

(五)快速排序

1. 排序思想

通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,再分别对这两部分记录进行下一趟排序,以达到整个序列有序。

2. 排序过程

设待排序的记录序列是R[s…t] ,在记录序列中任取一个记录(一般取R[s])作为参照(又称为基准或枢轴),以R[s].key为基准重新排列其余的所有记录,方法是:

◆所有关键字比基准小的放R[s]之前;

◆所有关键字比基准大的放R[s]之后。

以R[s].key最后所在位置i作为分界,将序列R[s…t]分割成两个子序列,称为一趟快速排序。

3. 一趟快速排序方法

从序列的两端交替扫描各个记录,将关键字小于基准关键字的记录依次放置到序列的前边;而将关键字大于基准关键字的记录从序列的最后端起,依次放置到序列的后边,直到扫描完所有的记录。

设置指针low,high,初值为第1个和最后一个记录的位置。

设两个变量i,j,初始时令i=low,j=high,以R[low].key作为基准(将R[low]保存在R[0]中) 。

①从j所指位置向前搜索:将R[0].key与R[j].key进行比较:

◆若R[0].key≤R[j].key :令j=j-1,然后继续进行比较,直到i=j或R[0].key>R[j].key为止;

◆若R[0].key>R[j].key :R[j]⇒R[i],腾空R[j]的位置,且令i=i+1;

②从i所指位置起向后搜索:将R[0].key与R[i].key进行比较:

◆若R[0].key≥R[i].key :令i=i+1,然后继续进行比较,直到i=j或R[0].key

◆若R[0].key

重复①、②,直至i=j为止,i就是R[0](基准)所应放置的位置。

4. 算法实现

⑴一趟快速排序算法的实现

int quick_one_pass(Sqlist R , int low, int high)

{ int i=low, j=high ;

R[0]=R[i] ; /* R[0]作为临时单元和哨兵*/

do {

while (LQ(R[0].key, R[j].key)&&(j>i))

j-- ;

if (j>i) { R[i]=R[j] ; i++; }

while (LQ(R[i].key, R[0].key)&&(j>i))

i++ ;

if (j>i) { R[j]=R[i] ; j--; }

} while(i!=j) ; /* i=j时退出扫描*/

R[i]=R[0] ; return(i) ;

}

⑵快速排序算法实现

当进行一趟快速排序后,采用同样方法分别对两个子序列快速排序,直到子序列记录个为1为止。

①递归算法

void quick_Sort(Sqlist R , int low, int high)

{ int k ;

if (low

{ k=quick_one_pass(R, low, high);

quick_Sort(R, low, k-1);

quick_Sort(R, k+1, high);

} /* 序列分为两部分后分别对每个子序列排序*/

}

②非递归算法

void quick_Sort(Sqlist R , int low, int high)

{ int k , stack[MAX_STACK] , top=0;

do { while (low

{ k=quick_one_pass(R,low,high);

stack[++top]=high ; stack[++top]=k+1 ;

/* 第二个子序列的上,下界分别入栈*/

high=k-1 ;

}

if (top!=0)

{ low=stack[top--] ; high=stack[top--] ; }

}while (top!=0&&low

}

源程序清单:

#include

#include

#define MAX_SIZE 100

typedef struct RecType{

int key; //关键字码

char otherinfo;//其他域

}RecType;

typedef struct{

RecType R[MAX_SIZE];

int n;

}Sqlist;

void straight_insert_sort(Sqlist L, int n){ //直接插入排序int i,j;

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

L.R[0]=L.R[i]; j=i-1;

while(L.R[0].key

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

j--;

}

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

}

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

printf("%d %c\n",L.R[i].key,L.R[i].otherinfo);

}

void shell_pass(Sqlist &L,int n,int d){ //一趟希尔排序int j, k;

for(j=d+1;j<=n;j++){

L.R[0]=L.R[j] ;

k=j-d;

while((k>0)&&(L.R[0].key

L.R[k+d]=L.R[k] ; k=k-d ;

}

L.R[k+d]=L.R[0];

}

}

void shell_sort(Sqlist &L,int n,int dk[],int t){ //希尔排序

int i,j,m;

for(m=0;m

shell_pass(L,n,dk[m]);

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

printf("%3d",L.R[j].key);

printf("\n");

}

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

printf("%d %c\n",L.R[i].key,L.R[i].otherinfo);

}

void simple_selection_sort(Sqlist L,int n){ //直接选择排序int i,j,k;

for(i=1; i

k=i;

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

if(L.R[j].key

if(k!=i){

L.R[0]=L.R[k]; L.R[k]=L.R[i];

L.R[i]=L.R[0];

}

}

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

printf("%d %c\n",L.R[i].key,L.R[i].otherinfo);

}

void Heap_adjust(Sqlist &L, int low, int high){ //堆调整int k;

L.R[0]=L.R[low] ;

for (k=2*low; k<=high; k=k*2){

if ((k

k++ ;

if (L.R[k].key

L.R[low]=L.R[k] ; low=k ; }

else break ;

}

L.R[low]=L.R[0] ;

}

void Heap_Sort(Sqlist &L,int n){ //堆排序

int i,j ;

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

Heap_adjust(L, i , n) ;

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

L.R[0]=L.R[1] ; L.R[1]=L.R[i] ;

L.R[i]=L.R[0] ;

Heap_adjust(L, 1, i-1) ;

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

printf("%3d",L.R[j].key);

printf("\n");

}

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

printf("%d %c\n",L.R[i].key,L.R[i].otherinfo);

}

int quick_one_pass(Sqlist &L, int low, int high){ //一趟快速排序

int i=low, j=high ;

L.R[0]=L.R[i] ;

do{

while ((L.R[0].key<=L.R[j].key)&&(j>i))

j-- ;

if (j>i) { L.R[i]=L.R[j] ; i++; }

while ((L.R[i].key<=L.R[0].key)&&(j>i))

i++ ;

if (j>i) { L.R[j]=L.R[i] ; j--; }

}while(i!=j) ;

L.R[i]=L.R[0] ; return(i) ;

}

void quick_Sort(Sqlist &L,int n,int low,int high){ //快速排序

int i,k ;

if (low

k=quick_one_pass(L, low, high);

quick_Sort(L, n, low, k-1);

quick_Sort(L, n, k+1, high);

}

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

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

printf("\n");

}

void main(){

int a,i,t;

Sqlist L;

int dk[30];

printf("1.建表\n2.直接插入排序\n3.Shell排序\n4.直接选择排序\n5.堆排序\n6.快速排序\n0.退出\n");

while(1){

printf("\n请选择:");

scanf("%d",&a); getchar();

switch(a){

case 1: printf("请输入记录数量n:");

scanf("%d",&L.n);

for(i=1;i

printf("请输入关键字码与数据:");

scanf("%d,%c",&L.R[i].key,&L.R[i].otherinfo);

}

break;

case 2:straight_insert_sort(L,L.n);

break;

case 3:printf("请输入增量数量t:");

scanf("%d",&t);

for(i=0;i

printf("请输入增量:");

scanf("%d",&dk[i]);

}

shell_sort(L,L.n,dk,t);

break;

case 4:simple_selection_sort(L,L.n);

break;

case 5:Heap_Sort(L,L.n);

break;

case 6:quick_Sort(L,L.n,1,L.n);

break;

case 0: exit(0);

}

}

}

运行结果:

数据结构实验报告-排序

数据结构实验报告-排序 一、实验目的 本实验旨在探究不同的排序算法在处理大数据量时的效率和性能表现,并对比它们的优缺点。 二、实验内容 本次实验共选择了三种常见的排序算法:冒泡排序、快速排序和归并排序。三个算法将在同一组随机生成的数据集上进行排序,并记录其性能指标,包括排序时间和所占用的内存空间。 三、实验步骤 1. 数据的生成 在实验开始前,首先生成一组随机数据作为排序的输入。定义一个具有大数据量的数组,并随机生成一组在指定范围内的整数,用于后续排序算法的比较。 2. 冒泡排序 冒泡排序是一种简单直观的排序算法。其基本思想是从待排序的数据序列中逐个比较相邻元素的大小,并依次交换,从而将最大(或最小)的元素冒泡到序列的末尾。重复该过程直到所有数据排序完成。 3. 快速排序

快速排序是一种分治策略的排序算法,效率较高。它将待排序的序列划分成两个子序列,其中一个子序列的所有元素都小于等于另一个子序列的所有元素。然后对两个子序列分别递归地进行快速排序。 4. 归并排序 归并排序是一种稳定的排序算法,使用分治策略将序列拆分成较小的子序列,然后递归地对子序列进行排序,最后再将子序列合并成有序的输出序列。归并排序相对于其他算法的优势在于其稳定性和对大数据量的高效处理。 四、实验结果 经过多次实验,我们得到了以下结果: 1. 冒泡排序 在数据量较小时,冒泡排序表现良好,但随着数据规模的增大,其性能明显下降。排序时间随数据量的增长呈平方级别增加。 2. 快速排序 相比冒泡排序,快速排序在大数据量下的表现更佳。它的排序时间线性增长,且具有较低的内存占用。 3. 归并排序 归并排序在各种数据规模下都有较好的表现。它的排序时间与数据量呈对数级别增长,且对内存的使用相对较高。 五、实验分析

数据结构实验报告-排序

实验6:排序(主要排序算法的实现) 一、实验项目名称 主要排序算法的实现 二、实验目的 深入了解各种内部排序方法及效率分析。 三、实验基本原理 1.冒泡排序:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大 的一个或最小的一个。这个数就会从序列的最右边冒出来。时间复杂度:O(n^2) 2.快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所 有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快 速排序,整个排序过程可以递归进行,使整个数据变成有序序列。时间复杂度: O(nlogn) 3.归并排序:对于一个待排序的数组,首先进行分解,将整个待排序数组以mid中 间位置为界,一分为二,随后接着分割,直至到最小单位无法分割;开始进行治 的操作,将每两个小部分进行比较排序,并逐步合并;直至合并成整个数组的大 小。从而完成了整个排序的过程。时间复杂度:O(nlogn) 4.插入排序:插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排 序序列中从后向前扫描,找到相应位置并插入。时间复杂度:O(n^2) 5.希尔排序:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序; 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文 件恰被分成一组,算法便终止。时间复杂度:O(n^1.3) 6.选择排序:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存 放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然 后放到已排序的序列的末尾。. 以此类推,直到全部待排序的数据元素的个数 为零。时间复杂度O(n^2) 7.堆排序:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的 根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元 素重新构造成一个堆,这样根节点会是n个元素中的次小值,将其与n-1的元 素互换,剩下n-2个元素继续建堆。如此反复执行,便能得到一个有序序列了。 时间复杂度O(nlogn) 四、主要仪器设备及耗材 Window 11、Dev-C++5.11 五、实验步骤 1.导入库和预定义(h表示堆,q表示序列)

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

数据结构实验八快速排序实验报告 一、实验目的 1.掌握快速排序算法的原理。 2. 掌握在不同情况下快速排序的时间复杂度。 二、实验原理 快速排序是一种基于交换的排序方式。它是由图灵奖得主 Tony Hoare 发明的。快速 排序的原理是:对一个未排序的数组,先找一个轴点,将比轴点小的数放到它的左边,比 轴点大的数放到它的右边,再对左右两部分递归地进行快速排序,完成整个数组的排序。 优缺点: 快速排序是一种分治思想的算法,因此,在分治思想比较适合的场景中,它具有较高 的效率。它是一个“不稳定”的排序算法,它的工作原理是在大数组中选取一个基准值, 然后将数组分成两部分。具体过程如下: 首先,选择一个基准值(pivot),一般是选取数组的中间位置。然后把数组的所有值,按照大小关系,分成两部分,小于基准值的放左边,大于等于基准值的放右边。 继续对左右两个数组递归进行上述步骤,直到数组只剩一个元素为止。 三、实验步骤 1.编写快速排序代码: void quicksort(int *a,int left,int right) { int i,j,t,temp; if(left>right) return; temp=a[left]; i=left; j=right; while(i!=j) {

// 顺序要先从右往左移 while(a[j]>=temp&&i

数据结构实验报告排序

数据结构实验报告排序 数据结构实验报告:排序 引言: 排序是计算机科学中常见的算法问题之一,它的目标是将一组无序的数据按照特定的规则进行排列,以便于后续的查找、统计和分析。在本次实验中,我们将学习和实现几种常见的排序算法,并对它们的性能进行比较和分析。 一、冒泡排序 冒泡排序是最简单的排序算法之一,它通过不断交换相邻的元素,将较大(或较小)的元素逐渐“冒泡”到数组的一端。具体实现时,我们可以使用两层循环来比较和交换元素,直到整个数组有序。 二、插入排序 插入排序的思想是将数组分为两个部分:已排序部分和未排序部分。每次从未排序部分中取出一个元素,插入到已排序部分的适当位置,以保持已排序部分的有序性。插入排序的实现可以使用一层循环和适当的元素交换。 三、选择排序 选择排序每次从未排序部分中选择最小(或最大)的元素,与未排序部分的第一个元素进行交换。通过不断选择最小(或最大)的元素,将其放置到已排序部分的末尾,从而逐渐形成有序序列。 四、快速排序 快速排序是一种分治的排序算法,它通过选择一个基准元素,将数组划分为两个子数组,其中一个子数组的所有元素都小于等于基准元素,另一个子数组的所有元素都大于基准元素。然后对两个子数组分别递归地进行快速排序,最终

将整个数组排序。 五、归并排序 归并排序也是一种分治的排序算法,它将数组划分为多个子数组,对每个子数组进行排序,然后再将排好序的子数组合并成一个有序的数组。归并排序的实现可以使用递归或迭代的方式。 六、性能比较与分析 在本次实验中,我们对以上几种排序算法进行了实现,并通过对不同规模的随机数组进行排序,比较了它们的性能。我们使用了计算排序时间的方式,并记录了每种算法在不同规模下的运行时间。通过对比实验结果,我们可以得出以下结论: 1. 冒泡排序和插入排序在处理小规模数据时表现较好,但在处理大规模数据时性能较差,因为它们的时间复杂度为O(n^2)。 2. 选择排序的时间复杂度也为O(n^2),与冒泡排序和插入排序相似,但相对而言,选择排序的性能稍好一些。 3. 快速排序是一种高效的排序算法,它的平均时间复杂度为O(nlogn),但在最坏情况下可能达到O(n^2)。快速排序的性能受到基准元素的选择和划分策略的影响。 4. 归并排序是一种稳定的排序算法,它的时间复杂度为O(nlogn),但相对较高的空间复杂度可能成为其不足之处。 结论: 通过本次实验,我们深入学习了几种常见的排序算法,并对它们的性能进行了比较和分析。不同的排序算法适用于不同规模和类型的数据,我们可以根据实

数据结构排序的实验报告

数据结构排序的实验报告 数据结构排序的实验报告 一、引言 数据结构是计算机科学中的重要概念,它用于组织和存储数据,以便于有效地 进行操作和处理。排序算法是数据结构中的一个重要应用,它可以将无序的数 据按照一定的规则进行排列,提高数据的查找、插入和删除效率。本实验旨在 比较不同排序算法的性能表现,并分析其优缺点。 二、实验方法 本实验选取了常见的四种排序算法:冒泡排序、插入排序、选择排序和快速排序。实验使用Python语言实现,并通过随机生成的整数数组进行测试。实验环境为一台配置良好的计算机。 三、实验步骤 1. 冒泡排序:从数组的第一个元素开始,与相邻元素比较并交换位置,重复此 过程直到数组完全有序。实验记录交换次数和比较次数。 2. 插入排序:将数组分为有序和无序两部分,每次从无序部分选择一个元素插 入到有序部分的正确位置。实验记录比较次数和移动次数。 3. 选择排序:从数组中选择最小的元素,与数组的第一个元素交换位置,然后 从剩余的无序部分选择最小元素与第二个元素交换位置,以此类推。实验记录 交换次数和比较次数。 4. 快速排序:选择一个基准元素,将数组分为两部分,左边部分的元素小于等 于基准元素,右边部分的元素大于基准元素,然后分别对两部分进行递归排序。实验记录比较次数。

四、实验结果 经过多次实验,记录并统计了每种排序算法的性能表现。结果显示,快速排序在大规模数据集上表现最优,其次是插入排序,冒泡排序和选择排序性能相对较差。 五、实验分析 1. 冒泡排序的时间复杂度为O(n^2),在大规模数据集上表现较差。其交换次数和比较次数均较高,导致性能不佳。 2. 插入排序的时间复杂度为O(n^2),但在小规模数据集上表现较好。其移动次数较高,但比较次数相对较低,适用于部分有序的数据。 3. 选择排序的时间复杂度也为O(n^2),且交换次数较多。虽然比较次数相对较低,但性能仍不如快速排序。 4. 快速排序的时间复杂度为O(nlogn),在大规模数据集上表现最佳。其比较次数较高,但交换次数相对较少,适用于各种数据情况。 六、结论 根据实验结果和分析,我们可以得出以下结论: 1. 不同的排序算法适用于不同规模和特征的数据集,选择合适的排序算法可以提高排序效率。 2. 在大规模数据集上,快速排序表现最优,其时间复杂度较低。 3. 在小规模数据集上,插入排序表现较好,其时间复杂度相对较低。 七、实验总结 通过本实验,我们深入了解了不同排序算法的原理和性能表现。数据结构中的排序算法是计算机科学中的基础知识,对于编程和算法设计有着重要的影响。

(完整word版)数据结构各种排序实验报告

目录 1。引言 .................................................................................................................... 错误!未定义书签。 2.需求分析 (2) 3.详细设计 (2) 3。1 直接插入排序 (2) 3.2折半排序 (2) 3。3 希尔排序 (4) 3。4简单选择排序 (4) 3.5堆排序 (4) 3。6归并排序 (5) 3。7冒泡排序 (7) 4.调试 (8) 5.调试及检验 (8) 5.1 直接插入排序 (8) 5。2折半插入排序 (9) 5。3 希尔排序 (10) 5。4简单选择排序 (10) 5。5堆排序 (11) 5.6归并排序 (12) 5。7冒泡排序 (12) 6。测试与比较........................................................................................................ 错误!未定义书签。 6.1调试步骤.................................................................................................... 错误!未定义书签。 6.2结论 (13) 7.实验心得与分析 (13) 8.附录 (14) 8。1直接插入排序 (14) 8.2折半插入排序 (15) 8。3希尔排序 (17) 8。4简单选择排序 (18) 8。5堆排序 (20) 8。6归并排序 (22) 8.7冒泡排序 (25) 8.8主程序 (26)

排序算法实验报告

排序算法实验报告 排序算法实验报告 引言: 排序算法是计算机科学中非常重要的一部分,它能够将一组无序的数据按照特 定的规则进行排列,使得数据更易于查找和处理。本次实验旨在比较不同排序 算法的性能和效率,并分析它们在不同数据规模下的表现。 一、实验背景 排序算法是计算机科学中的经典问题之一,其应用广泛,包括数据库管理、搜 索引擎、图像处理等领域。在实际应用中,我们常常需要对大量数据进行排序,因此选择一种高效的排序算法对于提高程序的运行效率至关重要。 二、实验目的 本次实验的主要目的是比较不同排序算法的性能和效率,并找出最适合不同数 据规模的排序算法。通过实验,我们可以了解不同排序算法的原理和特点,进 一步理解算法的设计思想和时间复杂度。 三、实验方法 1. 实验环境 本次实验使用的是一台配置较高的个人计算机,操作系统为Windows 10,处理器为Intel Core i7,内存为8GB。 2. 实验数据 为了比较不同排序算法的性能,我们选择了不同规模的随机整数数组作为实验 数据,包括1000个元素、10000个元素和100000个元素。 3. 实验步骤

我们选取了常见的几种排序算法进行实验,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序和快速排序。具体实验步骤如下: (1)生成随机整数数组; (2)使用不同的排序算法对数组进行排序; (3)记录每种排序算法的运行时间; (4)比较不同排序算法的性能和效率。 四、实验结果与分析 在实验中,我们记录了每种排序算法的运行时间,并进行了对比分析。下面是实验结果的总结: 1. 数据规模为1000个元素时,各排序算法的运行时间如下: 冒泡排序:2.3ms 选择排序:1.9ms 插入排序:1.6ms 希尔排序:0.9ms 归并排序:0.6ms 快速排序:0.5ms 2. 数据规模为10000个元素时,各排序算法的运行时间如下: 冒泡排序:240ms 选择排序:190ms 插入排序:160ms 希尔排序:90ms 归并排序:60ms

排序实验报告

排序实验报告 排序实验报告 引言 排序是计算机科学中的一个重要概念,它指的是将一组元素按照特定的规则进行重新排列的过程。排序算法的选择和性能对于提高计算机程序的效率至关重要。为了深入了解不同排序算法的优劣,我们进行了一系列的排序实验。 实验设计 本次实验选择了五种常见的排序算法进行比较,包括冒泡排序、插入排序、选择排序、快速排序和归并排序。在实验中,我们使用了Python编程语言来实现这些排序算法,并通过随机生成的整数数组作为排序的输入。 实验过程 在实验过程中,我们首先使用了冒泡排序算法。冒泡排序算法的基本思想是从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。通过多次遍历数组,将最大的元素逐渐“冒泡”到数组的末尾。冒泡排序算法的时间复杂度为O(n^2)。 接下来,我们实现了插入排序算法。插入排序算法的核心思想是将数组分为已排序和未排序两部分,每次从未排序部分中取出一个元素,并将其插入到已排序部分的适当位置。插入排序算法的时间复杂度也是O(n^2)。 然后,我们使用了选择排序算法。选择排序算法的基本思想是每次从未排序的部分中选择最小的元素,然后将其与未排序部分的第一个元素交换位置。通过多次遍历数组,将最小的元素逐渐选择到数组的开头。选择排序算法的时间复杂度同样为O(n^2)。

接下来,我们实现了快速排序算法。快速排序算法是一种分治法的排序算法, 其基本思想是选择一个基准元素,将数组分为两个子数组,一个子数组中的元 素都小于基准元素,另一个子数组中的元素都大于基准元素。然后,对这两个 子数组分别进行快速排序。快速排序算法的时间复杂度为O(nlogn)。 最后,我们使用了归并排序算法。归并排序算法也是一种分治法的排序算法, 其基本思想是将数组递归地分成两个子数组,然后将这两个子数组合并成一个 有序数组。归并排序算法的时间复杂度同样为O(nlogn)。 实验结果 通过对不同大小的随机数组进行排序实验,我们得到了如下的实验结果:冒泡 排序算法的性能最差,其运行时间随着数组大小的增加呈平方级增长;插入排 序和选择排序算法的性能相对较好,但仍然随着数组大小的增加呈平方级增长;快速排序和归并排序算法的性能最佳,其运行时间随着数组大小的增加呈线性 对数级增长。 结论 通过本次排序实验,我们深入了解了冒泡排序、插入排序、选择排序、快速排 序和归并排序等常见的排序算法。我们发现不同的排序算法在不同的情况下具 有不同的性能表现,因此在实际应用中需要根据具体情况选择合适的排序算法。同时,我们也认识到了算法的时间复杂度对于算法性能的重要性,通过选择时 间复杂度较低的算法可以提高程序的效率。 总结 通过本次排序实验,我们对不同排序算法的实现和性能有了更深入的了解。排 序算法作为计算机科学中的基础知识,对于提高程序的效率和性能至关重要。

排序算法实验报告

数据结构实验报告 八种排序算法实验报告 一、实验内容 编写关于八种排序算法的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); 原表是否有序,对简单选择排序、堆排序、归并排序和基数排序的时间复杂度影响不大。 稳定性: 排序算法的稳定性:若待排序的序列中,存在多个具有相同关键字的记录,经过排序,这些记录的相对次序保持不变,则称该算法是稳定的;若经排序后,记录的相对次序发生了改变,则称该算法是不稳定的。 稳定性的好处:排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。另外,如果排序算法稳定,可以避免多余的比较; 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序

数据结构排序实验报告

数据结构排序实验报告 1. 引言 数据结构是计算机科学中的重要概念,它涉及组织和管理数据的方式。排序算法是数据结构中的重要部分,它可以将一组无序的数据按照一定的规则进行重新排列,以便更容易进行搜索和查找。在本实验中,我们将对不同的排序算法进行研究和实验,并对其性能进行评估。 2. 实验目的 本实验旨在通过比较不同排序算法的性能,深入了解各算法的特点,从而选择最适合特定场景的排序算法。 3. 实验方法 本实验使用C++编程语言实现了以下排序算法:冒泡排序、选择排序、插入排序、快速排序和归并排序。为了评估这些算法的性能,我们设计了一组实验来测试它们在不同数据规模下的排序时间。

4. 实验过程 4.1 数据生成 首先,我们生成了一组随机的整数数据作为排序的输入。数据 规模从小到大递增,以便观察不同算法在不同规模下的性能差异。 4.2 排序算法实现 接下来,我们根据实验要求,使用C++编程语言实现了冒泡排序、选择排序、插入排序、快速排序和归并排序。每个算法被实 现为一个独立的函数,并按照实验顺序被调用。 4.3 性能评估 我们使用计时器函数来测量每个排序算法的执行时间。在测试 过程中,我们多次运行每个算法,取平均值以减小误差。 5. 实验结果

我们将在不同数据规模下运行每个排序算法,并记录它们的执行时间。下表展示了我们的实验结果: 数据规模(n)冒泡排序选择排序插入排序快速排序归并排序 1000 2ms 3ms 1ms 1ms 1ms 5000 20ms 15ms 10ms 3ms 5ms 10000 85ms 60ms 30ms 5ms 10ms 50000 2150ms 1500ms 700ms 10ms 15ms 从上表我们可以观察到,随着数据规模的增加,冒泡排序和选择排序的执行时间呈指数级增长,而插入排序、快速排序和归并排序的执行时间则相对较稳定。此外,当数据规模较大时,快速排序和归并排序的性能远优于其他排序算法。 6. 实验结论 根据实验结果,我们可以得出以下结论:

【精编范文】快速排序算法实验报告-范文word版 (17页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除! == 本文为word格式,下载后可方便编辑和修改! == 快速排序算法实验报告 篇一:快速排序( 实验报告附C++源码) 快速排序 一、问题描述 在操作系统中,我们总是希望以最短的时间处理完所有的任务。但事情总是要一件件地做,任务也要操作系统一件件地处理。当操作系统处理一件任务时,其他待处理的任务就需要等待。虽然所有任务的处理时间不能降低,但我们可以安排它们的处理顺序,将耗时少的任务先处理,耗时多的任务后处理,这样就可以使所有任务等待的时间和最小。 只需要将n 件任务按用时去从小到大排序,就可以得到任务依次的处理顺序。当有 n 件任务同时来临时,每件任务需要用时ni,求让所有任务等待的时间和最小的任务处理顺序。 二、需求分析 1. 输入事件件数n,分别随机产生做完n件事所需要的时间; 2. 对n件事所需的时间使用快速排序法,进行排序输出。排序时,要求轴 值随机产生。 3. 输入输出格式: 输入: 第一行是一个整数n,代表任务的件数。 接下来一行,有n个正整数,代表每件任务所用的时间。输出: 输出有n行,每行一个正整数,从第一行到最后一行依次代表着操作系统要处理的任务所用的时间。按此顺序进行,则使得所有任务等待时间最小。 4. 测试数据:输入 9

5 3 4 2 6 1 5 7 3 输出 1 2 3 3 4 5 5 6 7 三、概要设计 抽象数据类型 因为此题不需要存储复杂的信息,故只需一个整型数组就可以了。 算法的基本思想 对一个给定的进行快速排序,首先需要选择一个轴值,假设输入的数组中有k 个小于轴值的数,于是这些数被放在数组最左边的k个位置上,而大于周知的结点被放在数组右边的n-k个位置上。k也是轴值的下标。这样k把数组分成了两个子数组。分别对两个子数组,进行类似的操作,便能得到正确的排序结果。 程序的流程 输入事件件数n-->随机产生做完没个事件 所需时间-->对n个时间进行排序-->输出结果 快速排序方法(因图难画,举一个实例):初始状态 72 6 57 88 85 42 l r 第一趟循环 72 6 57 88 85 42 l r 第一次交换 6 72 57 88 85 42 l r 第二趟循环 6 72 57 88 85 42 r l 第二次交换 72 6 57 88 85 42 r l 反转交换 6 72 57 88 85 42 r l 这就是依靠轴值,将数组分成两部分的实例(特殊情况下,可能为一部分,其中42是轴值)。对分成的两部分数组,分别尽心类似的操作,便可得符合要求的结果。 快速排序的函数模块; void qsort(int* array,int l,int r) { if(r<=l)return; int pivotIndex=l+rand()%(r-l+1);//随机选定轴值 swap1(array,pivotIndex,r);//将选定的轴值放到每段数组的最后 int k=partition(array,l-1,r,array[r]); //依靠轴值,将数组分//成两部分 swap1(array,k,r);//将轴值放到正确的位置上

c语言排序实验报告

c语言排序实验报告 C语言排序实验报告 引言: 排序是计算机科学中非常重要的一项基础操作,它在各个领域都有广泛的应用。本实验旨在通过使用C语言实现不同的排序算法,对比它们的性能和效率,并 对排序算法的实现原理进行深入探讨。 一、实验背景 排序算法是将一组无序的数据按照特定的规则进行重新排列的过程。在计算机 科学中,常用的排序算法包括冒泡排序、选择排序、插入排序、快速排序等。 这些算法的不同之处在于其时间复杂度、空间复杂度以及稳定性等方面的差异。 二、实验目的 1. 理解不同排序算法的基本原理和实现方法; 2. 掌握C语言的基本语法和数组操作; 3. 比较不同排序算法的性能和效率。 三、实验过程 1. 冒泡排序 冒泡排序是一种简单的排序算法,它通过比较相邻元素的大小并交换位置来实 现排序。具体实现过程如下: ``` void bubbleSort(int arr[], int n) { for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-i-1; j++) {

int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } ``` 2. 选择排序 选择排序是一种简单直观的排序算法,它每次从待排序的数据中选择最小(或最大)的元素放到已排序序列的末尾。具体实现过程如下: ``` void selectionSort(int arr[], int n) { for (int i = 0; i < n-1; i++) { int minIndex = i; for (int j = i+1; j < n; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } int temp = arr[i];

数据结构实验四题目一排序实验报告

数据构造实验报告 实验名称:实验四——排序 学生:** 班级: 班序号: 学号: 日期: 1.实验要求 实验目的: 通过选择实验容中的两个题目之一,学习、实现、比照、各种排序的算法,掌握各种排序算法的优劣,以及各种算法使用的情况。 题目1: 使用简单数组实现下面各种排序算法,并进展比拟。 排序算法如下: 1、插入排序; 2、希尔排序; 3、冒泡排序; 4、快速排序; 5、简单项选择择排序; 6、堆排序; 7、归并排序; 8、基数排序〔选作〕; 9、其他。 具体要求如下: 1、测试数据分成三类:正序、逆序、随机数据。 2、对于这三类数据,比拟上述排序算法中关键字的比拟次数和移动次数〔其中关 键字交换记为3次移动〕。 3、对于这三类数据,比拟上述排序算法中不同算法的执行时间,准确到微妙。 4、对2和3的结果进展分析,验证上述各种算法的时间复杂度。 5、编写main〔〕函数测试各种排序算法的正确性。 2. 程序分析 2.1 存储构造 存储构造:数组

2.2 关键算法分析 一、关键算法: 1、插入排序 a、取排序的第二个数据与前一个比拟 b、假设比前一个小,则赋值给哨兵 c、从后向前比拟,将其插入在比其小的元素后 d、循环排序 2、希尔排序 a、将数组分成两份 b、将第一份数组的元素与哨兵比拟 c、假设其大与哨兵,其值赋给哨兵 d、哨兵与第二份数组元素比拟,将较大的值赋给第二份数组 e、循环进展数组拆分 3、对数据进展编码 a、取数组元素与下一个元素比拟 b、假设比下一个元素大,则与其交换 c、后移,重复 d、改变总元素值,并重复上述代码 4、快速排序 a、选取标准值 b、比拟上下指针指向元素,假设指针保持前后顺序,且后指针元素大于标准值, 后指针前移,重新比拟 c、否则后面元素赋给前面元素 d、假设后指针元素小于标准值,前指针后移,重新比拟 e、否则前面元素赋给后面元素 5、简单项选择择排序 a、从数组中选择出最小元素 b、假设不为当前元素,则交换 c、后移将当前元素设为下一个元素 6、堆排序 a、生成小顶堆 b、将堆的根节点移至数组的最后 c、去掉已做过根节点的元素继续生成小顶堆 d、数组倒置 7、归并排序 a、将数组每次以1/2拆分,直到为最小单位 b、小相邻单位数组比拟重排合成新的单位

排序的实验报告范文

排序的实验报告范文数据结构实验报告 实验名称:实验四排序 学生姓名: 班级: 班内序号: 学号: 日期:2022年12月21日 实验要求 题目2 使用链表实现下面各种排序算法,并进行比较。排序算法: 1、插入排序 2、冒泡排序 3、快速排序 4、简单选择排序 5、其他 要求: 1、测试数据分成三类:正序、逆序、随机数据。

2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)。 4、对2和3的结果进行分析,验证上述各种算法的时间复杂度。 编写测试main()函数测试线性表的正确性。 2、程序分析 2.1存储结构 说明:本程序排序序列的存储由链表来完成。 其存储结构如下图所示。 (1)单链表存储结构: 结点地址:1000HA[2] 结点地址:1000H 1080H …… 头指针地址:1020HA[0] 头指针 地址:1020H 10C0H

…… 地址:1080HA[3] 地址:1080H NULL …… 地址:10C0HA[1] 地址:10C0H 1000H …… (2)结点结构 tructNode { intdata; Node某ne某t; }; 示意图: intdataNode某ne某t intdata Node某ne某t

2.2关键算法分析 一:关键算法 (一)直接插入排序voidLinkSort::InertSort() 直接插入排序是插入排序中最简单的排序方法,其基本思想是:依次将待排序序列中的每一个记录插入到一个已排好的序列中,直到全部记录都排好序。 (1)算法自然语言 1.将整个待排序的记录序列划分成有序区和无序区,初始时有序区为待排序记录序列中的第一个记录,无序区包括所有剩余待排序的记录; 2.将无须去的第一个记录插入到有序区的合适位置中,从而使无序区减少一个记录,有序区增加一个记录; 3.重复执行2,直到无序区中没有记录为止。 (2)源代码 voidLinkSort::InertSort()//从第二个元素开始,寻找前面那个比它大的{ Node某P=front->ne某t;//要插入的节点的前驱 while(P->ne某t) { Node某S=front;//用来比较的节点的前驱 while(1)

排序的实验报告

排序的实验报告 排序的实验报告 引言: 排序是计算机科学中非常重要的一个概念,它涉及到对一组数据按照一定规则进行重新排列的操作。在计算机算法中,排序算法的效率直接影响到程序的运行速度和资源利用率。为了深入了解各种排序算法的原理和性能,我们进行了一系列的排序实验。 实验一:冒泡排序 冒泡排序是最简单的排序算法之一。它的原理是通过相邻元素的比较和交换来实现排序。我们编写了一个冒泡排序的算法,并使用Python语言进行实现。实验中,我们分别对10、100、1000个随机生成的整数进行排序,并记录了排序所需的时间。 实验结果显示,随着数据规模的增加,冒泡排序的时间复杂度呈现出明显的增长趋势。当数据规模为10时,排序所需的时间约为0.001秒;而当数据规模增加到1000时,排序所需的时间则增加到了1.5秒左右。这说明冒泡排序的效率较低,对大规模数据的排序并不适用。 实验二:快速排序 快速排序是一种常用的排序算法,它的核心思想是通过分治的策略将数据分成较小的子集,然后递归地对子集进行排序。我们同样使用Python语言实现了快速排序算法,并对相同规模的数据进行了排序实验。 实验结果显示,快速排序的时间复杂度相对较低。当数据规模为10时,排序所需的时间约为0.0005秒;而当数据规模增加到1000时,排序所需的时间仅为

0.02秒左右。这说明快速排序适用于大规模数据的排序,其效率较高。 实验三:归并排序 归并排序是一种稳定的排序算法,它的原理是将待排序的数据分成若干个子序列,然后将子序列两两合并,直到最终得到有序的结果。我们同样使用Python 语言实现了归并排序算法,并进行了相同规模数据的排序实验。 实验结果显示,归并排序的时间复杂度相对较低。当数据规模为10时,排序所需的时间约为0.0008秒;而当数据规模增加到1000时,排序所需的时间仅为0.03秒左右。这说明归并排序同样适用于大规模数据的排序,其效率较高。 讨论与结论: 通过以上实验,我们可以得出以下结论: 1. 冒泡排序虽然简单易懂,但对于大规模数据的排序效率较低,不适用于实际应用。 2. 快速排序和归并排序是两种高效的排序算法,它们对大规模数据的排序具有较好的性能。 3. 在实际应用中,我们需要根据数据规模和性能需求选择合适的排序算法。 总结: 排序是计算机科学中重要的基础操作之一,各种排序算法的性能直接影响到程序的效率。通过本次实验,我们深入了解了冒泡排序、快速排序和归并排序这三种常见的排序算法,并通过实验数据对它们的性能进行了评估。在实际应用中,我们可以根据数据规模和性能需求选择合适的排序算法,以提高程序的运行效率。

排序的实验报告

实验报告 实验目的:排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。 通过冒泡排序,快速排序,选择排序来进一步的理解排序的思想,并且可 以通过这些来认知它们之间的不同点。 实验环境:实验采用C++语言,在VC 6.0的编译下进行。 实验准备:C++面向对象程序设计-谭浩强编著 数据结构-严蔚敏吴伟民编著 实验内容:冒泡排序 排序过程: 首先将第一个记录的关键字和第二个记录的关键进行比较,若为逆序则将两个 记录交换,然后比较第二个记录和第三个记录的关键字。以此类推,直到第 n-1个记录和第n个记录的关键字进行过比较为止,上述过程为第一趟冒泡排 序,其结果使得关键字最大的记录被安置在最后一个记录位置上。然后进行第 二次排序,对前n-1个记录进行同样操作,其结果是使得关键字次大的被安排 在第n-1个记录位置上。 重复以上操作,直到在一趟排序中没有进行过交换记录的操作。 快速排序: 基本思想 通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关 键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行 (递归)排序,以达到整个序列有序。 排序过程: 对其进行一趟快速排序的做法是:定义一个数组和变量low,high. 初时令i=low, j=high,k=a[low] 首先从high所指的位置起向前搜索到第一个关键字小于k的记录,并和其 进行交换。 再从low所指位置向后搜素,找到第一个关键字大于k的记录,并和其进 行交换。 重复这两步直到low=high为止。 选择排序: 基本思想是:每一趟在n-i+1(i=123…..,n-1)个记录中选取关键字最小的 记录,作为有序序列中第i个记录。 排序过程:首先通过n-1次关键字比较,从n个记录中找出关键字最小的 记录,将它与第一个记录交换 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它 与第二个记录交换 重复上述操作,共进行n-1趟排序后,排序结束 实验过程及结果:内部排序 快速排序 #include usingnamespace std; int quicksort(int a[],int low,int high) {

相关主题
文本预览
相关文档 最新文档