当前位置:文档之家› (完整word版)数据结构各种排序实验报告

(完整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。需求分析

课程题目是排序算法的实现,课程设计一共要设计八种排序算法。这八种算法共包括:堆排序,归并排序,希尔排序,冒泡排序,快速排序,基数排序,折半插入排序,直接插入排序。

为了运行时的方便,将八种排序方法进行编号,其中1为堆排序,2为归并排序,3为希尔排序,4为冒泡排序,5为快速排序,6为基数排序,7为折半插入排序8为直接插入排序。

软件环境:

Windows-7操作系统,所使用的软件为c-Free;

2。概要设计

2.1 直接插入排序

⑴算法思想:直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到一个已排好序的有序表中,从而得到一个新的、记录数增一的有序表。在自i—1起往前搜索的过程中,可以同时后移记录.整个排序过程为进行n—1趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。

⑵程序实现及核心代码的注释:

for (i = 1 ; i < r。length ;++i )

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

if(r.base[i] 〈r。base[j])

{

temp = r.base[i]; //保存待插入记录

for(i= i ;i 〉j; --i )

r.base[i]= r.base[i-1]; //记录后移

r。base[j]= temp;//插入到正确的为位置

r.base[r。length] =’\0’;

2.2折半排序

⑴算法思想:由于折半插入排序的基本操作是在一个有序表中进行查找和插入,这个“查找”操作可利用折半查找来实现,由此进行的插入排序称之为折半插入排序。折半插入排序所需附加存储空间和直接插入排序相同,从时间上比较,这般插入排序仅减少了关键字间的比较次数,而记录的移动次数不变。因此,这般插入排序的时间复杂度仍为O(n2)。

⑵程序实现及核心代码的注释:

void zb(FILE *fp)

{//对顺序表作折半插入排序

for (i = 1 ; i 〈r。length ; i++ )

temp=r.base[i]; //将r。base[i]寄存在temp中low=0;

high=i-1;

while(low 〈= high ) //在base[low]到key[high]中折

半查找有序插入的位置{

m = (low+high)/2;//折半

if (temp 〈r。base[m] )

high = m—1;//插入低半区

else

low = m+1;//插入高半区

}

for( j=i-1; j>=high+1; —-j )

r。base[j+1]= r.base[j];//记录后移

r。base[high+1]=temp; //插入

2。3 希尔排序

⑴算法思想:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。其中,子序列的构成不是简单的“逐段分割",而是将分隔某个“增量"的记录组成一个子序列。

⑵程序实现及核心代码的注释:

for(k = 0;k 〈10 ;k++)

m = 10 - k;

for( i = m ;i < r。length; i ++ )

if(r。base[i] < r.base[i - m])

temp = r。base[i]; //保存待插记录

for(j = i - m ;j 〉= 0 && temp 〈r.base[j];j —= m)

r。base[ j + m ] = r.base[j]; //记录后移,查找插入位置

r.base[ j + m ] = temp; //插入

}

}

2.4简单选择排序

⑴算法思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止.

⑵程序实现及核心代码的注释:

for (i = 0 ; i 〈r。length ;i++ )

{ //i为排好序的数的下标,依次往后存放排//好序

的数

temp=r.base[i];//将待放入排好序的数的下标的数保存

for(j = i,m = j +1 ; m < r。length ;m++)//找出未排序的数中最小的数的循环;

if(r.base[j]〉r.base[m])

j = m;

r。base[i]= r.base[j]; //把下标为j的数与i数互换;

r。base[j]= temp;

}

2。5堆排序

⑴算法思想:堆排序只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间.将序列所存储的元素A[N]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的元素均不大于(或不小于)其左右孩子(若存在)结点的元素。算法的平均时间复杂度为O(N log N).

⑵程序实现及核心代码的注释:

void dp(FILE *fp)

for(i = r.length / 2;i 〉= 1 ; ——i)//把r。base[1...r。length]建成大顶堆HeapAdjust(r。base,i,r.length);

for(i = r.length ;i 〉= 2 ;--i)

temp = r.base[1];

r。base[1] = r.base[i];

r.base[i]= temp;

HeapAdjust(r.base,1,i-1); //将r。base[1。。。i—1]重新调整为大顶堆}

void HeapAdjust(char *r,int k,int m)

i=k; x=r[i];j=2*i; //沿key 较大的孩子节点向下筛选

while(j<=m)//j为key较大的记录的下标

if( (j〈m) && (r[j]〉r[j+1]) )

j++;

if(x〉r[j])

{ //插入字符比当前的大,交换

r[i]=r[j];

i = j;

j *= 2;

else //否则比较停止.

j = m + 1;

r[i]= x; //把字符x插入到该位置,元素插入实现

2。6归并排序

⑴算法思想:先将相邻的个数为1的每两组数据进行排序合并;然后对上次归并所得到的大小为2的组进行相邻归并;如此反复,直到最后并成一组,即排好序的一组数据。

⑵程序实现及核心代码的注释:

void merge(SqList6 r,int h ,int m ,int w ,SqList6 t)

{ //对相邻两组数据进行组合排序;

int i,j,k;

i = h ;

j = m + 1; //j为合并的第二组元素的第一个数位置

k =h-1;// k为存入t中的数的位置;

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

{ //依次排列两组数据

k++;

if(r.base[i]<= r.base[j])//将第一组数据与第二组数据分别比较;

t。base[k]= r.base[i++];

else

t.base[k] = r。base[j++];

if(i 〉m)//第一组数据先排完的情况

while(j 〈= w)t.base[++k]=r.base[j++];

else

while(i 〈= m)t。base[++k]=r。base[i++];

}

void tgb(int s,int n,SqList6 r,SqList6 t)

{//对数据进行每组s个数的归并排序;

int i=1; //i为要合并两组元素的第一个数位置;

while(i〈=(n—2*s+1))

merge(r,i,i+s-1,i+2*s—1,t); //i+s—1为要合并的第一组元素的最后一

//数位置、i+2*s-1 为要合并的两组元素

//最后一个数位置;

i=i+2*s;

if(i〈(n-s+1))//考虑n不能被s整除,如果余下的数少于

//2*s 但大于s,也就是余下的数不能凑成

//两组,凑一组有余,则把余下的数进行组

//合,并对其进行排序;

merge(r,i,i+s-1,n,t);

else //如果余下的数少于s,则余下的数进行组//合,并进

行排序;

while(i<=n)

t。base[i]=r.base[i++];

void gb(FILE *fp) // 归并主函数;

{

n = r.length;

SqList6 t;

t。base=(char *)malloc(r。stacksize*sizeof(char));

//给待排序的数组t申请内存;

while(s〈n)//每组元素不断增加循环进行合并排序;

{

tgb(s,n,r,t); // s为每组元素的个数、n为元素总个数、r

//为原数组,t为待排序的数组,进行归并排s*=2;//序;把元素个数相同的两组合并并进行重新

//定义成新的一组,此组元素个数为2*s;

if(s〈n){tgb(s,n,t,r); s *= 2; }

//当元素个数小于n时,对其进行合并排序;

else //当元素个数大于n时,对剩下的数排序;

i=0;

while(i<=n)

r。base[i]=t。base[i+1];

i++;

}

2.7冒泡排序

⑴算法思想:1、先将一组未排序的数组的最后一个数与倒数第二个数进行比较,并将较小的数放于两个数中较前的位置,然后将比较后的较小的数与倒数第三个进行比较,依次比较到第一个数,即可得到第一个数是所有数中最小的数;2、然后再将数组的最后一个数与倒数第二个数进行比较,并将较小的数放于两个数中较前的位置,依次比较到第二个数,3、如此循环到只剩最后两个比较,即得到排好序的一组数.

⑵程序实现及核心代码的注释:

for(i=0;i 〈r.length ;i++ ) // i为排好序的数的下标,依次往后存放排好序的数;{

for(j = r.length-2;j >= i;j -- )//从后往前依次两两比较,较小的被调换到前面;

if(r。base[j+1]〈r.base[j]) //比较相邻两个数,如果后面的小于前面的,向下执行;

temp = r。base[j+1];//将后面的较小的数保存起来;

r。base[j+1]= r。base[j];//将前面的较大的数放在后面较小的数的位置;

r.base[j]= temp;//将较小的数放在前面的较大的数的位置;

}

3.调试

检测主函数是否能够稳定运行(如图4-1):

图4—1

5。调试及检验

5。1 直接插入排序

输入字符并保存(如图5-1.1):

调用算法【1】处理文件(如图5—1.2):

处理结果(如图5-1。3):

图5-1。1 图5-1.2

图5-1。3

5.2折半插入排序

输入字符并保存(如图5—2.1):

调用算法【2】处理文件(如图5-2.2):

处理结果(如图5-2。3):

图5-2。1图5-2。2

图5—2.3

5。3 希尔排序

输入字符并保存(如图5—3.1):

调用算法【3】处理文件(如图5—3。2):

处理结果(如图5-3.3):

图5—3。1图5-3。2

图5—3。3

5。4简单选择排序

输入字符并保存(如图5-4。1):

调用算法【4】处理文件(如图5—4。2):

处理结果(如图5—4。3):

图5-4。1图5—4。2

图5—4。3

5。5堆排序

输入字符并保存(如图5—5.1):

调用算法【5】处理文件(如图5—5。2):

处理结果(如图5—5。3):

图5—5。1图5-5。2

图5-5.3

5。6归并排序

输入字符并保存(如图5—6。1):

调用算法【6】处理文件(如图5-6。2):

处理结果(如图5—6。3):

图5—6.1图5-6。2

图5-6。3

5。7冒泡排序

输入字符并保存(如图5-7.1):

调用算法【7】处理文件(如图5-7.2):

处理结果(如图5-7.3):

图5—7。1图5—7.2

图5—7。3

6.2结论

通过实验结果的比较与分析我们发现:直接插入排序、冒泡排序、简单选择排序及折半插入排序是低效率的排序方式;所以我们实际编程重要尽可能的避免他们的出现;我们应该用较先进的归并排序及堆排序。7。实验心得与分析

通过本次课程设计,我们小组的每个成员都学到了很多东西。首先要说的是我们的编程能力,在这一次的课程设计中我们的编程能力均得到了一定程度的提升。并且通过这次课程设计,我们更加熟悉了如何使用Header File文件.本次课程设计,让我们对于直接插入排序,折半插入排序,希尔排序,简单选择排序,堆排序,归并排序,冒泡排序等七种排序算法的思想有了进一步的认识,同时对七种算法的应用有了更进一步的掌握。通过这次课程设计,我们对于解决实际问题的能力有了进一步提高。最重要的是,这次课程设计大大的训练了我们的小组团队协作能力。通过这次课程设计我们小组各成员的团队协作能力都有了很大的提升。这种团队协作能力对于我们学编程的来说是极其重要的,同时也是必不可少的。

当然,我们写程序的时候遇到了很多困难。而且在程序调试过程中出现了很多错误与警告,不过在队员及老师的帮助下均得到了解决。当程序可以运行后,程序的运行过程中同样也也出现了很多错误,甚至出现了不兼容的情况。不过,后来在队员及老师的帮助下也均得到了解决。然而,我们的程序还有一点瑕疵让我们感到美中不足。那就是在归并算法运行过程中,当输入为9个字符时,排序结果会出现偶然误差。经过分析,我们认为这点是系统的问题.不过,这仍然是一点让我们感到遗憾的地方.

8。附录

8.1直接插入排序

#include〈stdio.h>

#include

#define Q 1000

typedef struct {

char *base ;

int stacksize ;

int length;

}SqList1;

void zj(FILE *fp)

SqList1 r;

int i,j;

char temp,*p;

r。base=(char *) malloc(Q*sizeof(char));

r。stacksize = Q;

r.length = 0;

while(!feof(fp))

fscanf(fp,"%c",r.base);

r.base++;

r.length++;

if(r。length == r。stacksize )

r。base= r。base - r。length;

r.base=(char *)realloc(r。base,(r.stacksize + Q) * sizeof(char));

if(!r。base)

{

printf("ERROR");

return ;

}

r.base = r。base + r。stacksize;

r。stacksize += Q;

}

r.length ——;

r.base -—;

r。base= r.base - r.length;

for (i = 1 ; i 〈r。length ;++i )

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

if(r。base[i]< r.base[j])

temp = r。base[i];

for(i= i ;i 〉j;—-i )

r。base[i]= r.base[i-1];

r。base[j]= temp;

}

r。base[r.length]='\0';

rewind(fp);

fprintf(fp,”%s”,r。base);

fclose(fp);

free(r.base);

8.2折半插入排序

#include

#include〈stdlib。h〉

#define Q 1000

typedef struct {

char *base ;

int stacksize ;

int length;

}SqList2;

void zb(FILE *fp)

SqList2 r;

int i,j ,m, low, high;

char temp;

r.base=(char *) malloc(1000*sizeof(char));

r.stacksize = 1000;

r。length = 0;

while(!feof(fp))

fscanf(fp,”%c",r.base);

r。base++;

r.length++;

if(r.length == r.stacksize )

r。base= r。base — r。length;

r.base=(char *)realloc(r.base,(r。stacksize + Q) *sizeof(char));

if(!r。base)

printf(”ERROR”);

return ;

}

r.base = r。base + r.stacksize;

r.stacksize += Q;

r.length —-;

r.base —-;

r.base= r.base — r.length;

for ( i = 1 ; i 〈r.length ; i++ )

{

temp=r。base[i];

low=0;

high=i-1;

while(low <= high )

{

m = (low+high)/2;

if (temp < r.base[m] )

high = m—1;

else

low = m+1;

}

(完整word版)数据结构各种排序实验报告for(j=i—1; j〉=high+1;-—j )

r。base[j+1]= r。base[j];

r。base[high+1]=temp;

}

r.base[r。length]='\0’;

rewind(fp);

fprintf(fp,"%s",r。base);

fclose(fp);

free(r.base);

8.3希尔排序

#include

#include〈stdlib。h>

#define Q 1000

typedef struct {

char *base ;

int stacksize ;

int length;

}SqList3;

void xe(FILE *fp)

SqList3 r;

int i,j,k,m;

char temp;

r。length = 0;

r.base=(char *) malloc(1000*sizeof(char));

r.stacksize = 1000;

while(!feof(fp))

{

fscanf(fp,"%c”,r.base);

r.base++;

r.length++;

if(r.length == r。stacksize )

{

r.base= r.base — r.length;

r.base=(char *) realloc(r.base,(r。stacksize + Q)*sizeof(char));

if(!r.base)

printf(”ERROR”);

return ;

}

r。base = r。base + r。stacksize;

r。stacksize += Q;

}

r。length -—;

r。base —-;

r。base= r.base - r.length;

for(k = 0; k 〈10 ; k++)

m = 10 — k;

for(i = m ; i 〈r.length; i ++ )

if(r。base[i] < r.base[i — m])

{

temp = r。base[i];

for(j = i — m ;j 〉= 0 && temp < r。base[j]; j —= m) r.base[j + m ]= r.base[j];

r.base[ j + m ] = temp;

rewind(fp);

fprintf(fp,”%s",r。base);

fclose(fp);

free(r.base);

8.4直接选择排序

#include

#include

#define Q 1000

typedef struct {

char *base ;

int stacksize ;

int length;

}SqList4;

void jd(FILE *fp)

{

SqList4 r;

int i,j ,m;

char temp;

r。base=(char *)malloc(1000*sizeof(char));

r.stacksize = 1000;

r.length = 0;

while(!feof(fp))

fscanf(fp,"%c”,r.base);

r。base++;

r。length++;

if(r。length == r.stacksize )

r.base= r。base - r。length;

r。base=(char *)realloc(r。base,(r。stacksize + Q)*sizeof(char));

if(!r。base)

{

printf(”ERROR”);

return ;

r。base = r。base + r。stacksize;

r。stacksize += Q;

}

r。length -—;

r.base —-;

r.base= r.base - r。length;

for ( i = 0 ;i < r.length ; i++ )

temp=r.base[i];

for(j = i,m = j +1 ;m 〈r.length ; m++)

if(r.base[j] 〉r。base[m])

j = m;

r.base[i]= r。base[j];

r.base[j]= temp;

r.base[r.length]=’\0';

rewind(fp);

fprintf(fp,"%s”,r。base);

fclose(fp);

free(r。base);

8。5堆排序

#include

#include

#define Q 1000

typedef struct {

char *base ;

int stacksize ;

int length;

}SqList5;

void HeapAdjust(char *r,int s,int m);

void dp(FILE *fp)

{

SqList5 r;

int i,j;

char temp,*k;

r.length = 0;

r.base=(char *)malloc(1000*sizeof(char));

r。stacksize = 1000;

r.base += 1;

while(!feof(fp))

fscanf(fp,"%c",r。base);

r。base++;

r。length++;

if(r.length == (r.stacksize - 1) )

数据结构实验报告-排序

实验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.插入排序:直接插入排序的基本操作是,将一个记录到已排好序的有序表中,从而得到一个新的,记录增一得有序表。 一般情况下,第i趟直接插入排序的操作为:在含有i-1个记录的有序子序列r[1..i-1]中插入一个记录r[i]后,变成含有i个记录的有序子序列r[1..i];并且,和顺序查找类似,为了在查找插入位置的过程中避免数组下标出界,在r[0]处设置哨兵。在自i-1起往前搜索的过程中,可以同时后移记录。整个排序过程为进行n-1趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第2个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。 2.快速排序:基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序的序列为{L.r[s],L.r[s+1],…L.r[t]},首先任意选取一个记录(通常可选第一个记录L.r[s])作为枢轴(或支点)(pivot),然后按下述原则重新排列其余记录:将所有关键字较它小的记录都安置在它的位置之前,将所有关键字较大的记录都安置在它的位置之后。由此可以该“枢轴”记录最后所罗的位置i作为界线,将序列{L.r[s],…,L.r[t]}分割成两个子序列{L.r[i+1],L.[i+2],…,L.r[t]}。这个过程称为一趟快速排序,或一次划分。 一趟快速排序的具体做法是:附设两个指针low和high,他们的初值分别为low和high,设枢轴记录的关键字为pivotkey,则首先从high所指位置起向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录互相交换,然后从low所指位置起向后搜索,找到第一个关键字大于pivotkey的记录和枢轴记录互相交换,

数据结构实验报告内部排序算法比较

实验报告——内部排序算法比较 一、需求分析 1.本演示程序对以下5种常用内部排序算法进行实测比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序。 2.待排序表的元素的关键字为整数。用随机数生成数据做测试比较。比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动)。 二、概要设计 1.可排表的抽象数据类型用数组定义。 2.本程序包含两个模块: (1)主程序模块 void main() { 初始化; do{ 接受命令; 处理命令; }while(“命令”!=“退出”); } (2)可排序表单元模块——实现可排序表的抽象数据类型; 个各模块之间的调用关系如下: 主程序模块 ↓ 可排序表单元模块 三、详细设计 1.根据题目要求和可排序表的基本操作特点,可排序表采用数组存储结构,并以100个随机数作为输入数据,实现在头文件stdlib.h。 2.具体代码 void Swap(int &i,int &j) {//交换i,j int t; t=i; i=j; j=t; } void Copy(int data[],int n,int data1[]) { int i; for(i=1;i<=n;i++) { data1[i]=data[i];

} } void Print(int data[],int n) { int i; for(i=1;i<=n;i++) { printf("%d ",data[i]); if(i%10==0) printf("\n"); } } void BubbleSort(int data[],int n) {//冒泡排序 int i,j,k,data1[101],compare=0; Copy(data,n,data1); for(i=1;i<=n;i++) { k=0; for(j=1;j<=n-i;j++) if(data1[j]>data1[j+1]) { Swap(data1[j+1],data1[j]); k++; compare+=4; } if(!k) break; } printf("冒泡排序后数据为:\n"); Print(data1,n); printf("共做了%d次。\n",compare); } void InsertSort(int data[],int n) {//直接插入排序 int i,j,data1[101],compare=0; Copy(data,n,data1); for(i=2;i<=n;i++) { if(data1[i]

数据结构(C 版)各种排序和查找的应用

---------------------------------------------------------------最新资料推荐------------------------------------------------------ 数据结构(C++版)各种排序和查找的应用 数学与计算机学院实验报告( 2019 /2019 学年第 1 学期)课程名称数据结构课程代码任课教师指导教 师学生姓名学号年级专业综合成绩实验 名称查找和排序指导教师实验类型□验证综合实验学时 2+10 实验日期实验时间实验编号 1 分组号 1 实验地点实验 报告一、实验目的和要求 1.掌握静态表查找存储结构和算法; 2.掌握动态表查找存储结构和算法 3.掌握折半查找算法和二叉 排序树查找算法。 4.掌握常用的排序方法及实现; 5.深刻理解排序的定义 和各种排序方法的特点,并能加以灵活应用实验要求: 了解掌握查找算法的基本思想和算法的实现;了解各种方法的 排序过程及依据的原则,并掌握各种排序方法的时间复杂度的分析 方法。 二、实验环境(实验设备) 硬件: 微型计算机 P5 软件: Windows XP+Microsoft Visual C++ 6. 0 三、实验原理及 内容实验题目: 给出 n 个学生的考试成绩表,每条信息由姓名和 分数组成,试完成下列操作: 1. 输入 n 个学生的姓名和成绩,保存于考试成绩表中; 2. 排序: 使用直接插入排序算法对学生的分数按升序排列,结果保存在 1 / 6

原考试成绩表中。 3. 输出: 按一行一个学生信息的方式输出 n 个这生考试成绩表。 4. 查找: 对于经步骤 2 排序好的考试成绩表,请使用二分查找算法查找 分数为 x 的学生,若存在则输出学生的姓名和分数,否则输出查 无此人信息。 5.根据 1 中输入的成绩表 1)建立二叉排序树; 2)使用 中序遍历算法输出中序遍历序列; 3)查找成绩为 x 的学生,若 存在输出该学生信息,否则输出未找到信息。 实验中完成 1-5 题;实验后完成: 将考试成绩表分别使用希尔排序、堆排序对分数进行升序和降 序排列并输出。 2 实验报告实验解答: 1. 学生考试成绩表的结构体定义 struct student{ char name[15]; float score; } ; 2. 学生考试成绩表的定义(数组)#define MAX 2 Student s[MAX]; 3. n 个学生录入的算法 代码 void table: : create() { char n[15]; for(int i=0; iMAX; i++) { cout输入姓名: ; cinn; strcpy(s[i]. name, n) ; cout输入成绩: ; cins[i]. score; } } 4.按分数进行直接插入排 序算法的代码 void table: : sort() { float temp; int i, j;

最新数据结构顺序表实验报告心得体会(模板11篇)

最新数据结构顺序表实验报告心得体会(模板11篇) (经典版) 编制人:__________________ 审核人:__________________ 审批人:__________________ 编制单位:__________________ 编制时间:____年____月____日 序言 下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢! 并且,本店铺为大家提供各种类型的经典范文,如合同协议、工作计划、活动方案、规章制度、心得体会、演讲致辞、观后感、读后感、作文大全、其他范文等等,想了解不同范文格式和写法,敬请关注! Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! Moreover, our store provides various types of classic sample essays, such as contract agreements, work plans, activity plans, rules and regulations, personal experiences, speeches, reflections, reading reviews, essay summaries, and other sample essays. If you want to learn about different formats and writing methods of sample essays, please stay tuned!

(完整word版)顺序表的操作实验报告

顺序表的基本操作 一、实验目的 1、复习C++语言程序设计中的知识。 2、熟悉线性表的逻辑结构。 3、熟悉线性表的基本运算在两种存储结构上的实现。 4、掌握顺序表的存储结构形式及其描述和基本运算的实现。 5、熟练掌握动态链表结构及有关算法的设计 二、实验内容 实现顺序表的建立、取元素、修改元素、插入、删除等顺序表的基本操作。 [基本要求] (1).依次从键盘读入数据,建立带头结点的顺序表; (2).输出顺序表中的数据元素 (3).根据指定条件能够取元素和修改元素; (4).实现在指定位置插入和删除元素的功能。 三、实验步骤、调试及输出结果 (—) . 数据结构与核心算法的设计描述: #include #include /*顺序表的定义:*/ #define ListSize 100 typedef struct {int elem[ListSize]; /*向量elem用于存放表结点*/ int length; /*当前的表长度*/ }SeqList; /*顺序表的建立:*/ void CreateList(SeqList *L,int n) {int i; printf("please input n numbers:\n"); for(i=1;i<=n;i++) scanf("%d",&L->elem[i]); L->length=n;

} /*顺序表的打印:*/ void PrintList(SeqList *L,int n) {int i; printf("the sqlist is\n"); for(i=1;i<=n;i++) printf("%d ",L->elem[i]); printf("\n"); } /*顺序表的查找:*/ int LocateList(SeqList *L,int x) {int i; i=1; while (((L->elem[i])!=x) &&(i<=10)) ++i; if ((L->elem[i])==x) return(i); else return(0); } /*顺序表的插入:*/ void InsertList(SeqList *L,int x,int i) {int j; if (i<1 ||i>L->length+1) printf("no insert position!\n"); else {for(j=L->length;j>=i;j--) L->elem[j+1]=L->elem[j]; L->elem[i]=x; L->length++; } } /*顺序表的删除:*/

数据结构课程设计报告---几种排序算法的演示(附源代第四次实验码)

本周的实验主要做快速排序,自己随机生成10000个数据,用快速排序算法,输出排序完成所需时间,再用其他排序方法做比较,至少完成两个算法的效率比较 数据结构课程设计报告 —几种排序算法的演示

时间:2010-1-14 一需求分析 运行环境 Microsoft Visual Studio 2005 程序所实现的功能 对直接插入排序、折半插入排序、冒泡排序、简单选择排序、快速排序、堆排序、归并排序算法的演示,并且输出每一趟的排序情况。 程序的输入(包含输入的数据格式和说明) <1>排序种类三输入 <2>排序数的个数的输入 <3>所需排序的所有数的输入 程序的输出(程序输出的形式) <1>主菜单的输出 <2>每一趟排序的输出,即排序过程的输出 二设计说明 算法设计思想 <1>交换排序(冒泡排序、快速排序) 交换排序的基本思想是:对排序表中的数据元素按关键字进行两两比较,如果发生逆序(即排列顺序与排序后的次序正好相反),则两者交换位置,直到所有数据元素都排好序为止。 <2>插入排序(直接插入排序、折半插入排序) 插入排序的基本思想是:每一次设法把一个数据元素插入到已经排序的部分序列的合适位置,使得插入后的序列仍然是有序的。开始时建立一个初始的有序序列,它只包含一个数据元素。然后,从这个初始序列出发不断插入数据元素,直到最后一个数据元素插到有序序列后,整个排序工作就完成了。 <3>选择排序(简单选择排序、堆排序) 选择排序的基本思想是:第一趟在有n个数据元素的排序表中选出关键字最小的数据元素,然后在剩下的n-1个数据元素中再选出关键字最小(整个数据表中次小)的数据元素,依次重复,每一趟(例如第i趟,i=1,…,n-1)总是在当前剩下的n-i+1个待排序数据元素中选出关键字最小的数据元素,作为有序数据元素序列的第i个数据元素。等到第n-1趟选择结束,待排序数据元素仅剩下一个时就不用再选了,按选出的先后次序所得到的数据

(完整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)

数据结构 实验报告 排序

实验报告 报告人:高晓铮(1120101390) 实验目的: 1.掌握各种排序方法的排序过程; 2.了解一些排序算法的实现。 实验内容: 学生的考试成绩表由学生的学号、姓名和成绩组成,设计一个程序对给定的n个学生信息实现: 1.按分数高低排序,打印出每个学生在考试中的排名,分数相同的为同一名次,同一名次的学生按学号从小到大排列。 2.按照名次列出每个学生的名次、学号、姓名、成绩。 实验原理: 排序分为插入排序、交换排序、选择排序、归并排序等。插入排序又分为直接插入排序、其他插入排序和希尔排序;交换排序分为冒泡排序和快速排序;选择排序又分为简单选择排序和堆排序。不同的排序方法各有利弊,根据具体的情况选择合适的排序方法。 设计思想: 本程序采用简单选择排序的方法。程序中定义一个stu结构和student类。类中定义creat 创建函数,selectgrade成绩排序函数,samegrade、selectnum成绩相同的按学号排序函数,print输出函数。按照选择排序的思想,先对成绩按照从高到低进行排序;然后寻找成绩相同的部分,对该局部元素的学号从小到大进行排序。然后调用输出函数,输出名次、学号、姓名、成绩。 实现部分: 源代码: #include struct stu { int num; char name[100]; int grade; }; class student { struct stu s[100]; int length; int start,end; public: student(){length=0;} void creat(); void selectgrade();

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

数据构造实验报告 实验名称:实验四——排序 学生:** 班级: 班序号: 学号: 日期: 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、小相邻单位数组比拟重排合成新的单位

【精编范文】快速排序算法实验报告-范文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);//将轴值放到正确的位置上

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

实验五(快速、堆、基数)排序算法的设计 一、实验目的和要求 实验目的: 1.深刻理解排序的定义和各种排序方法的特点,并能灵活运用。 2.掌握常用的排序方法,并掌握用高级语言实现排序算法的方法。 3.了解各种方法的排序过程及其依据的原则,并掌握各种排序方法的性能的分析方法。实验要求: 要求彻底弄懂排序的物理存储结构,并通过此试验为以后的现实使用打下基础。二、实验内容和原理: (1)实验内容: 设计快速排序,堆排序和基数排序的算法。 (2)实验原理: 快速排序:在待排序的n个数据中,任取一个数据为基准,经过一次排序后以基准数据把全部数据分为两部分,所有数值比基准数小的都排在其前面,比它大的都排在其后,然后对这两部分分别重复这样的过程,直到全部到为为止。堆排序:对待排序的n个数据,依它们的值大小按堆的定义排成一个序列,从而输出堆顶的最小值数据(按最小值跟堆排序),然后对剩余的数据再次建堆,便得到次小的,如此反复进行输出和建堆,直到全部排成有序列。基数排序:LSD法:先按最低关键字位k1对待排序数据中的n个值进行排序,按k1值把待排序文件中的n个记录分配到具有不同k1值的若干个堆,然后按k1值从小到大的次序收集在一起,下次再按高一位关键子位k2的值进行分配和收集,如此不断地按更高一位关键字位进行分配和收集,直到用kn分配和收集之后,整个数据按多关键字位有序。 三、实验环境 硬件: (1)学生用微机;(2)多媒体实验教室;(3)局域网环境; 软件: (1)Windows XP中文操作系统;(2)Turbo C 3.0; 四、算法描述及实验步骤 描述: (1)快速排序: 例:初始关键字36 73 65 97 13 i j j向左扫描后36 73 65 97 13 i j

数据结构课程设计报告(各种排序实现及对比)

数据结构课程设计报告 设计题目: 学生姓名: 系别: 专业: 班级: 学号: 指导教师: 2010年版

目录 一、设计题目 (4) 二、运行环境(软、硬件环境) (4) 三、算法设计的思想 (4) 3.1简单选择排序 (4) 3.2直接插入排序 (4) 3.3希尔排序 (4) 3.4冒泡排序 (4) 3.5快速排序 (4) 四、算法的流程图 (5) 4.1主函数的算法流程图………………………………………... 5. 4.2简单选择排序的算法流程图 (6) 4.3直接插入排序的算法流程图 (7) 4.4希尔排序的算法流程图 (8) 4.5冒泡排序的算法流程图 (9) 4.6快速排序的算法流程图(1) (10) 4.7快速排序的算法流程图(2) (11) 五、算法设计分析 (11) 5.1简单选择排序 (11) 5.2直接插入排序 (12) 5.3希尔排序 (12) 5.4冒泡排序 (13) 5.5快速排序 (13) 六、源代码 (14) 七、运行结果分析 (23) 八、收获及体会 (26)

一、设计题目 各种排序 二、运行环境(软、硬件环境) 软件环境: 操作系统的名称windows、版本号XP; 程序开发的环境: Microsoft Visual C++ 6.0 硬件环境:内存:512M,硬盘:80G 三、算法设计的思想 3.1简单选择排序 <1> 基本思想 每一趟在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列的第i个关键字。 3.2插入排序 <1> 基本思想 插入排序的思想就是读一个,排一个,将第1个数放入数组的第1个元素中,以后读入的数与已存入数组的数进行比较,确定它在从大到小的排列中应处的位置.将该位置以及以后的元素向后推移一个位置,将读入的新数填入空出的位置中. 3.3希尔排序 <1> 基本思想 希尔排序法是1959年由D.L.Shell提出来的,又称减少增量的排序。下表是以八个元素排序示范的例子.在该例中,开始时相隔4个成分,分别按组进行排序,这时每组2个成分,共4组; 然后相隔2个成分,在按组排序......最后,对所有相邻成分进行排序. 3.4冒泡排序 <1> 基本思想 依次比较相邻的两个数,把大的放前面,小的放后面.即首先比较第1个数和第2个数,大数放前,小数放后.然后比较第2个数和第3个数......直到比较最后两个数.第一趟结束,最小的一定沉到最后.重复上过程,仍从第1个数开始,到最后第2个数.然后...... 由于在排序过程中总是大数往前,小数往后,相当气泡上升,所以叫冒泡排序. 3.5快速排序 <1> 基本思想 快速排序的基本思想是基于分治策略的。对于输入的子序列L[p..r],如果规模足够小则直接进行排序,否则分三步处理:

数据结构排序实验报告

数据结构排序实验报告

《数据结构》课程设计报告 实验五排序 一、需求分析: 本演示程序用C++6.0编写,完成各种排序的实现,对输入的一组数字实现不同的排序方

法,对其由小到大顺序输出。 (1)分别对直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序算法进行编写。 (2)、对存储的函数即输入的数字进行遍历。 (3)、初始化函数对输入的数字进行保存。 (4)、主函数实现使用者操作界面的编写,对输入、选择、保存、输出的各种实现。这当中还包括了各个函数的调用的实现。 (5)、程序所能达到的功能:完成对输入的数字的生成,并通过对各排序的选择实现数字从小到大的输出。 二、程序主要功能以及基本要求: (1)、设计一个菜单,格式如下: 1、直接插入排序 2、希尔排序 3、冒泡排序 4、快速排序 5、选择排序 6、堆排序

7、退出 (2)、选择不同的菜单但进行相应的排序,并给出排序的关键字序列。 三、系统框架图: 本程序包含了9个函数,它们分别是: (1)、直接插入排序的算法函数InsertSort ()。 (2)、希尔排序的算法函数ShellSort ()。 (3)、冒泡排序算法函数BubbleSort ()。 (4)、快速排序的算法函数Partition ()。 (5)、选择排序算法函数SelectSort ()。 (6)、堆排序算法函数HeapAdjust ()。 (7)、对存储数字的遍历函数Visit ()。 (8)、初始化函数InitSqList ()。 (9)、主函数main ()。 四、详细设计 实现各个算法的主要内容,下面是各个函数 的主要信息: (1)各个排序函数的算法: 一、直接插入排序 void InsertSort(SqList &L) 主函数 各个排序算对输入的数操作界面的

数据结构实验七 排序认识实验(含完整源代码)

实验七排序认识实验 第一部分实验目的 简要描述实验目的 通过实验过程了解并熟悉冒泡排序和快速排序算法的特点以及使用范 围和效率。 第二部分实验流程 2.1 实验工具 操作系统:Microsoft Windows10 开发软件:Visual Studio 2012 处理器:Intel(R)Core(TM)********************.59GHz 2.2 实验内容 通过实验过程了解并熟悉冒泡排序和快速排序算法的特点以及使用范围和效率。 对冒泡排序和快速排序的代码编写进行调试与修改,使得程序运行成功。第三部分实验总结 3.1 实验完成任务

(一般情况下的冒泡排序) (一般情况下的快速排序) 3.2 实验简述 调试时出现无法查找或打开 PDB 文件,通过百度,解决方法: 1、打开 vs2015,点击菜单栏中的“工具”,找到选项, 2、在选项中,展开调试,打开常规,在右边的窗口中选中“启用源服务器支持”,这时会出现一个安全警报,点击“是”即可。 在快速排序执行结果时,出现了错误: 通过检查,发现是在未初始化的情况下使用了变量 n。经过调试,初始化了n,运行成功。 3.3 实验小结 快速排序心得:

设置两个变量 i、j,排序开始的时候:i=0,j=N-1; 以第一个数组元素作为关键数据,赋值给 key,即 key=A[0]; 从 j 开始向前搜索,即由后开始向前搜索(j--),找到第一个小于 key 的值 A[j],将 A[j]和 A[i]互换; 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将 A[i]和 A[j]互换; 重复第 3、4 步,直到 i=j; (3,4 步中,没找到符合条件的值,即 3 中 A[j] 不小于 key,4 中 A[i]不大于 key 的时候改变 j、i 的值,使得 j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候 i, j 指针位置不变。另外, i==j 这一过程一定正好是 i+或 j-完成的时候,此时令循环结束)。 通过对比学习,我明白了,快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。 最后,本次实验是数据结构课的最后一次实验,经过数据结构实验课的锻炼,使我们对数据结构有了更深刻的理解,使我对其知识起到了重要的影响,增加了我编程的实践活动,为我将来的进一步学习打下了基础。 第四部分设计实验 冒泡排序是从最底层元素开始比较,(与其上的元素比较)小于就往上再比,大于就交换,再用较小的往上比较,直到最高层,第一次把最小的放到最上层,第二次把第二小的放到第二层,以次类推。当最好的情况,也就是要排序的表本身是有序的,则只需进行n-1次比较,时间复杂度为O(n)。当最坏的情况,即待排序表是逆序的情况,此时需要比较n-1次,并做等数量级的记录移动,总的时间复杂度为O(n2)。因此,其平均时间复杂度为O(n2)。 快速排序是先找到一个轴值,比较时把所有比轴值小的放到轴值的左边,比轴值大的放到右边,再在两边各自选取轴值再按前面排序,直到完成。在最好的情况下,其时间复杂度为O(nlogn),在最坏的情况下,其时间复杂度为O(n2)。因此,其平均时间复杂度为O(nlogn)。 所以,总的来说,快速排序的效率要好于冒泡,尤其在n非常大时。

数据结构实验报告五,查找与排序-

数据结构实验报告五,查找与排序- 查找与排序 一、实验目的: 1.理解掌握查找与排序在计算机中的各种实现方法。 2.学会针对所给问题选用最适合的算法。 3.熟练掌握常用排序算法在顺序表上的实现。 二、实验要求: 掌握利用常用的查找排序算法的思想来解决一般问题的方法和技巧,进行算法分析并写出实习报告。 三、实验内容及分析: 设计一个学生信息管理系统,学生对象至少要包含:学号、性别、成绩1、成绩总成绩等信息。要求实现以下功能: 1.平均成绩要求自动计算; 2.查找:分别给定学生学号、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现); 3.? 排序:分别按学生的学号、成绩1、成绩2、平均成绩进行排序(要求至少用两种排序算法实现)。 四、程序的调试及运行结果 五、程序代码 #includestdio.h #includestring.h struct student//定义结构体 { char name; int a1,a2,a3,num; double pow; }zl;

int count=0; void jiemian1(); //主界面//函数声明 int jiemian2(); //选择界面 void luru(); //录入函数 void xianshi(); //显示 void paixv(); //排序 void diaoyong(int); //循环调用选择界面 void tianjia(); //添加信息 void chaxun1(); //按学号查询详细信息 void chaxun2(); //按姓名查询详细信息 void xiugai(); //修改信息 void shanchu(); //删除信息 void main() //main函数 { jiemian1();//函数点用 } void jiemian1() //主界面定义 { char a; printf(“\n\n\n\n\t\t\t学员信息管理器\n\n\n\t\t\t 数据结构课程设计练习六\n\n\n\t\t\t 09信计2:于学彬\n\n“); printf("\n\t\t\t 按回车键继续:"); scanf("%c", system("cls"); jiemian2(); } int jiemian2() //选择界面 { int a,b;

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