数据结构课程设计排序综合第四次实验Word文档格式.docx

上传人:b****1 文档编号:3702827 上传时间:2023-05-02 格式:DOCX 页数:19 大小:93.20KB
下载 相关 举报
数据结构课程设计排序综合第四次实验Word文档格式.docx_第1页
第1页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第2页
第2页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第3页
第3页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第4页
第4页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第5页
第5页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第6页
第6页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第7页
第7页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第8页
第8页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第9页
第9页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第10页
第10页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第11页
第11页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第12页
第12页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第13页
第13页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第14页
第14页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第15页
第15页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第16页
第16页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第17页
第17页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第18页
第18页 / 共19页
数据结构课程设计排序综合第四次实验Word文档格式.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数据结构课程设计排序综合第四次实验Word文档格式.docx

《数据结构课程设计排序综合第四次实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计排序综合第四次实验Word文档格式.docx(19页珍藏版)》请在冰点文库上搜索。

数据结构课程设计排序综合第四次实验Word文档格式.docx

doubleTInsertSort(inta[],intp),还有显示菜单的模块voidmenu()和显示排序结果模块voidDisp(inta[])等等,各个模块之间可以互相调用,节省了资源。

用case作为各个功能的入口。

用QueryPerformanceFrequency()和QueryPerformanceCounte()函数计时,精度比用clock()高,避免了很多时候因排序速度太快而出现运行时间为0的现象。

用srand函数作为随机数发生器的初始化函数,用rand产生随机数。

把计算得的排序时间存入数组并经冒泡排序得出最快的两种排序法。

下面是所用排序法的算法思想:

(1)直接插入排序的基本思想是基于插入,开始假定第一个记录有序,然后从第二个记录开始,依次插入到前面有序的子文件中。

即将记录a[i](2<

=i<

=n)插入到有序子序列a[1..i-1]中,使记录的有序序列从a[1..i-1]变为a[1..i],最终使整个文件有序。

共进行n-1趟插入。

最坏时间复杂度是0(n2),平均时间复杂度是0(n2),空间复杂度是O

(1),是稳定排序。

(2)直接选择排序的基本思想是基于选择,开始有序序列长度为零,第i(1<

n)趟简单选择排序是,从无序序列a[i..n]的n-i+1记录中选出关键字最小的记录,和第i个记录交换,使有序序列逐步扩大,最后整个文件有序。

共进行n-1趟选择。

最坏时间复杂度是0(n2),平均时间复杂度是0(n2),空间复杂度是O

(1),是不稳定排序。

(3)冒泡排序:

首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字。

依此类推,直到第N-1和第N个记录的关键字进行过比较为止。

上述为第一趟排序,其结果使得关键字的最大纪录被安排到最后一个记录的位置上。

然后进行第二趟起泡排序,对前N-1个记录进行同样操作。

一共要进行N-1趟起泡排序。

(4)快速排序思想:

从待排序列中任取一个元素(例如取第一个)作为中心,所有比它小的元素一律前放,所有比它大的元素一律后放,形成左右两个子表;

然后再对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个。

此时便为有序序列了。

(6)堆排序基本思想是:

堆是n个元素的序列,先建堆,即先选得一个关键字最大或最小的记录,然后与序列中最后一个记录交换,之后将序列中前n-1记录重新调整为堆(调堆的过程称为“筛选”),再将堆顶记录和当前堆序列的最后一个记录交换,如此反复直至排序结束。

优点是在时间性能与树形选择排序属同一量级的同时,堆排序只需要一个记录大小供交换用的辅助空间,调堆时子女只和双亲比较。

避免了过多的辅助存储空间及和最大值的比较。

2.3主要算法和处理流程图

3程序实现

3.1程序实现时应考虑的问题

模块化能使节约资源,也方便了程序的调试和增加功能。

3.2主要源代码及说明

#include<

stdio.h>

conio.h>

stdlib.h>

windows.h>

time.h>

#defineN30000

voidWrong()

{

printf("

\n=====>

按键错误!

\n"

);

getchar();

}

voidDisp(inta[])

inti;

system("

cls"

for(i=0;

i<

N;

i++)

{

if((i-1)%10==9)

printf("

%-7d"

a[i]);

}

voidInsertSort(inta[],intp)//插入排序

{

inti,j,temp;

for(i=1;

i++)

{

temp=a[i];

for(j=i;

j>

0&

&

a[j-1]>

temp;

j--)

a[j]=a[j-1];

a[j]=temp;

}

voidSelectSort(inta[],intp)//选择排序

inti,j,k;

N-1;

k=i;

for(j=i+1;

j<

j++)

if(a[j]<

a[k])

k=j;

if(k!

=i)

inttemp;

temp=a[k];

a[k]=a[i];

a[i]=temp;

}

voidBubbleSort(inta[],intp)/*冒泡排序算法*/

inti,j,temp;

for(i=0;

for(j=N-1;

i;

j--)/*比较,找出本趟最小关键字的记录*/

if(a[j]<

a[j-1])

temp=a[j];

/*进行交换,将最小关键字记录前移*/

a[j-1]=temp;

voidcreatheap(inta[],inti,intn)//创建堆

intj;

intt;

t=a[i];

j=2*(i+1)-1;

while(j<

=n)

if((j<

n)&

(a[j]<

a[j+1]))

j++;

if(t<

a[j])

{

a[i]=a[j];

i=j;

j=2*(i+1)-1;

}

else

j=n+1;

a[i]=t;

voidheapsort(inta[],intn,intp)//堆排序

inti;

intt;

for(i=n/2-1;

i>

=0;

i--)

creatheap(a,i,n-1);

for(i=n-1;

=1;

t=a[0];

a[0]=a[i];

a[i]=t;

creatheap(a,0,i-1);

voidquicksort(inta[],intn,intp)

inti,j,low,high,temp,top=-1;

structnode

intlow,high;

}st[N];

top++;

st[top].low=0;

st[top].high=n-1;

while(top>

-1)

{low=st[top].low;

high=st[top].high;

top--;

i=low;

j=high;

if(low<

high)

{temp=a[low];

while(i!

=j)

{while(i<

j&

a[j]>

temp)j--;

if(i<

j){a[i]=a[j];

i++;

while(i<

a[i]<

temp)i++;

j){a[j]=a[i];

j--;

st[top].low=low;

st[top].high=i-1;

st[top].low=i+1;

st[top].high=high;

doubleTInsertSort(inta[],intp)

intb[N];

b[i]=a[i];

LARGE_INTEGERm_liPerfFreq={0};

QueryPerformanceFrequency(&

m_liPerfFreq);

LARGE_INTEGERm_liPerfStart={0};

QueryPerformanceCounter(&

m_liPerfStart);

InsertSort(b,p);

LARGE_INTEGERliPerfNow={0};

liPerfNow);

doubletime=liPerfNow.QuadPart-m_liPerfStart.QuadPart;

time/=m_liPerfFreq.QuadPart;

if(p!

=6)

{Disp(b);

\n用直接插入排序法用的时间为%f秒;

"

time);

FILE*fp;

fp=fopen("

直接插入排序.txt"

"

w"

fprintf(fp,"

%d"

b[i]);

fclose(fp);

return(time);

doubleTSelectSort(inta[],intp)

for(i=0;

b[i]=a[i];

SelectSort(b,p);

\n用直接选择排序法用的时间为%f秒;

FILE*fp;

直接选择排序.txt"

fclose(fp);

doubleTBubbleSort(inta[],intp)

BubbleSort(b,p);

\n用冒泡排序法用的时间为%f秒;

冒泡排序.txt"

doubleTheapsort(inta[],intn,intp)

heapsort(b,N,p);

{Disp(b);

\n用堆排序法用的时间为%f秒;

堆排序.txt"

doubleTquicksort(inta[],intn,intp)

quicksort(b,N,p);

\n用快速排序法用的时间为%f秒;

fp=fopen("

快速排序.txt"

return(time);

voidBubleSort(doublea[])//时间数组的冒泡排序

inti,j;

doubletemp;

6;

for(j=4;

=i;

if(a[j+1]<

a[j])

{

temp=a[j+1];

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

}

voidmenu()

★☆**************欢迎来到综合排序系统!

****************★☆\n"

☆★☆★\n"

★☆★☆\n"

☆★※※※※※※※☆★\n"

★☆※菜单※★☆\n"

★☆**************

(1)---直接插入排序******************★☆\n"

☆★**************

(2)---直接选择排序******************☆★\n"

★☆**************(3)---冒泡排序******************★☆\n"

☆★**************(4)---快速排序******************☆★\n"

★☆**************(5)---堆排序******************★☆\n"

☆★**************(6)---时间效率比较******************☆★\n"

★☆**************(7)---显示随机数******************★☆\n"

☆★**************(0)---退出******************☆★\n"

★☆★☆\n"

☆★****************************************************☆★\n"

\n====>

请在上述序号中选择一个并输入:

voidmain()

inti,p,a[N];

srand((int)time(NULL));

/*随机种子*/

a[i]=rand()%50000+1;

while

(1)

system("

menu();

scanf("

%d"

&

p);

if(p==0)

=====>

谢谢使用!

getchar();

break;

doubleTIMES[5],TIMES1[5];

//时间数组

switch(p)

case1:

TInsertSort(a,p);

\n请按任意键继续..."

break;

case2:

TSelectSort(a,p);

case3:

TBubbleSort(a,p);

case4:

Tquicksort(a,N,p);

case5:

Theapsort(a,N,p);

case6:

TIMES1[1]=TIMES[1]=TInsertSort(a,p);

TIMES1[2]=TIMES[2]=TSelectSort(a,p);

TIMES1[3]=TIMES[3]=TBubbleSort(a,p);

TIMES1[4]=TIMES[4]=Tquicksort(a,N,p);

TIMES1[5]=TIMES[5]=Theapsort(a,N,p);

BubleSort(TIMES);

\n\n"

printf("

排序这组数据两种较快的排序法分别是:

if(TIMES[1]==TIMES1[1])printf("

直接插入排序:

%f秒!

TIMES[1]);

if(TIMES[1]==TIMES1[2])printf("

直接选择排序:

if(TIMES[1]==TIMES1[3])printf("

冒泡排序:

if(TIMES[1]==TIMES1[4])printf("

快速排序:

if(TIMES[1]==TIMES1[5])printf("

堆排序:

if(TIMES[1]!

=TIMES[2])

if(TIMES[2]==TIMES1[1])printf("

TIMES[2]);

if(TIMES[2]==TIMES1[2])printf("

直接选择排序%f秒!

if(TIMES[2]==TIMES1[3])printf("

冒泡排序%f秒!

if(TIMES[2]==TIMES1[4])printf("

快速排序%f秒!

if(TIMES[2]==TIMES1[5])printf("

堆排序%f秒!

}

}printf("

srand((int)time(NULL));

i++){a[i]=rand()%30000+1;

}getchar();

case7:

Disp(a);

随机数.txt"

i++)fprintf(fp,"

default:

Wrong();

\n请按任意键继续..

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2