第八次数据结构上机实验报告.docx

上传人:b****0 文档编号:18248739 上传时间:2023-08-14 格式:DOCX 页数:9 大小:35.53KB
下载 相关 举报
第八次数据结构上机实验报告.docx_第1页
第1页 / 共9页
第八次数据结构上机实验报告.docx_第2页
第2页 / 共9页
第八次数据结构上机实验报告.docx_第3页
第3页 / 共9页
第八次数据结构上机实验报告.docx_第4页
第4页 / 共9页
第八次数据结构上机实验报告.docx_第5页
第5页 / 共9页
第八次数据结构上机实验报告.docx_第6页
第6页 / 共9页
第八次数据结构上机实验报告.docx_第7页
第7页 / 共9页
第八次数据结构上机实验报告.docx_第8页
第8页 / 共9页
第八次数据结构上机实验报告.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

第八次数据结构上机实验报告.docx

《第八次数据结构上机实验报告.docx》由会员分享,可在线阅读,更多相关《第八次数据结构上机实验报告.docx(9页珍藏版)》请在冰点文库上搜索。

第八次数据结构上机实验报告.docx

第八次数据结构上机实验报告

一、调试成功程序及说明

1、

题目:

2.实现快速排序算法

算法思想:

1.设置两个变量i、j,排序开始的时候:

i=0,j=N-1;

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

3.从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;

4.从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

5.重复第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-完成的时候,此时令循环结束)。

源程序:

#include

#include

voidswap(int*x,int*y)

{

inttemp;

temp=*x;

*x=*y;

*y=temp;

}

intchoose_pivot(inti,intj)

{

return((i+j)/2);

}

voidquicksort(intlist[],intm,intn)

{

intkey,i,j,k;

if(m

{

k=choose_pivot(m,n);

swap(&list[m],&list[k]);

key=list[m];

i=m+1;

j=n;

while(i<=j)

{

while((i<=n)&&(list[i]<=key))

i++;

while((j>=m)&&(list[j]>key))

j--;

if(i

swap(&list[i],&list[j]);

}

//交换两个元素的位置

swap(&list[m],&list[j]);

//递归地对较小的数据序列进行排序

quicksort(list,m,j-1);

quicksort(list,j+1,n);

}

}

voidprintlist(intlist[],intn)

{

inti;

for(i=0;i

printf("%d\t",list[i]);

}

voidmain()

{

constintMAX_ELEMENTS=10;

intlist[MAX_ELEMENTS];

inti=0;

printf("请输入十位排序的数字,按enter终止输入:

");

for(i=0;i

{

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

}

printf("排序前的序列:

\n");

printlist(list,MAX_ELEMENTS);

//sortthelistusingquicksort

quicksort(list,0,MAX_ELEMENTS-1);

//printtheresult

printf("使用快速排序算法进行排序之后的序列:

\n");

printlist(list,MAX_ELEMENTS);

}

运行结果:

2、

题目:

3.实现堆排序算法;

算法思想:

1.先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区

2.再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key

3.由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。

然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。

源程序:

#include

 

#defineSUCCESS0

#defineERROR-1

 

/**

*调整堆

*index是数组下标,从0开始

*/

intHeapSort_adjust(int*piBuffer,constunsignedintuiSize,constunsignedintuiIndex)

{

int*piTmp=piBuffer;

unsignedinti=uiIndex;

unsignedintuiChild=i;

intiTmpValue=0;

if((NULL==piTmp)||(uiSize<2)||(uiIndex>=uiSize))/**入参判断*/

{

returnERROR;

}

for(i=uiIndex;i

{

uiChild=2*i+1;

/**找到子结点中较大的*/

if((uiChildpiBuffer[uiChild]))

{

uiChild++;

}

/**判断较大的子结点是否比父结点大*/

if((uiChild<=uiSize-1)&&(piBuffer[uiChild]>piBuffer[i]))

{

iTmpValue=piBuffer[i];

piBuffer[i]=piBuffer[uiChild];

piBuffer[uiChild]=iTmpValue;

}

else/**如果左右子结点都比父结点小,那么可以肯定这是一个大根堆了,可以结束循环了*/

{

break;

}

}

returnSUCCESS;

}

 

/**

*堆排序,这里使用大根堆,按照从小到大排序

*uiSize是数组大小,从1开始

*/

intHeapSort(int*piBuffer,constunsignedintuiSize)

{

int*piTmp=piBuffer;

inti=(uiSize-2)/2;

intiTmpValue=0;

if((NULL==piTmp)||(uiSize<2))/**入参判断*/

{

returnERROR;

}

/**首先进行堆的初始化,调整成一个大根堆*/

for(i=(uiSize-2)/2;i>=0;i--)/**数组下标从0开始,所以i的初始值为(uiSize-2)/2*/

{

HeapSort_adjust(piBuffer,uiSize,i);

}

/**把第0个元素与最后一个元素对调,重新调整堆*/

for(i=uiSize-1;i>0;i--)

{

iTmpValue=piBuffer[i];

piBuffer[i]=piBuffer[0];

piBuffer[0]=iTmpValue;

HeapSort_adjust(piBuffer,i,0);/**每次只需要调整前i个元素即可*/

}

returnSUCCESS;

}

 

/**

*打印数组内容

*/

intHeapSort_print(int*piBuffer,constunsignedintuiSize)

{

int*piTmp=piBuffer;

inti=0;

if(NULL==piTmp)/**入参判断*/

{

returnERROR;

}

/**打印数组内容,中间以逗号隔开*/

for(i=0;i

{

if(0==i)

{

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

}

else

{

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

}

}

printf("\n");

returnSUCCESS;

}

 

intmain(intargc,char*argv[])

{

inti,array[10];

printf("输入用于堆排序的十个数:

\n");

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

{

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

}

printf("排序后为:

\n");

HeapSort(array,sizeof(array)/sizeof(array[0]));/**堆排序*/

HeapSort_print(array,sizeof(array)/sizeof(array[0]));/**第二个参数是数组中元素个数,所以不能简单的用sizeof*/

returnSUCCESS;

}

运行结果:

 

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

当前位置:首页 > 高中教育 > 初中教育

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

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