北京邮电大学数据结构实验第三次实验排序Word格式文档下载.docx

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

北京邮电大学数据结构实验第三次实验排序Word格式文档下载.docx

《北京邮电大学数据结构实验第三次实验排序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《北京邮电大学数据结构实验第三次实验排序Word格式文档下载.docx(17页珍藏版)》请在冰点文库上搜索。

北京邮电大学数据结构实验第三次实验排序Word格式文档下载.docx

A0

A1

A2

A3

A4

A5

A6

3.2关键算法分析

1.插入排序:

依次将待排序的序列中的每一个记录插入到先前排序好的序列中,直到全部记录排序完毕

voidInsertsort(intr[],intn,int*compare,int*move)//插入排序

{

*compare=0;

*move=0;

inti;

intj;

for(i=1;

i<

n;

i++)//一共要排序n-1次

{intx=r[i];

for(j=i-1;

x<

r[j]&

&

j>

=0;

j--)

(*compare)++;

(*move)++;

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

}

if(j>

=0)

(*compare)++;

r[j+1]=x;

2.希尔排序:

先将整个序列分割成若干个子列,分别在各个子列中运用直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序

voidShellInsert(intr[],intn,int*compare,int*move)//希尔排序

for(intd=n/2;

d>

=1;

d=d/2)//间距越来越小

for(inti=d;

=n-1;

i++)//从a[d]往后逐个元素确定是否需要前移{if(r[i]<

r[i-d])//某元素比同组中的前一位小,则需要前移

for(j=i-d;

(j>

=0)&

(x<

r[j]);

j=j-d)//完成所需的所有前移{(*compare)++;

r[j+d]=r[j];

if(j>

r[j+d]=x;

else(*compare)++;

3.冒泡排序:

两两比较相邻记录的关键码,如果反序则交换,直到没有反序记录为止

voidBubblesort(intr[],intn,int*compare,int*move)//交换(冒泡)排序{*compare=0;

intx;

for(intj=0;

j<

n-1;

j++)//冒泡排序n-1次

for(inti=n-1;

i>

j;

i--)

if(r[i]<

r[i-1])

(*move)+=3;

x=r[i];

r[i]=r[i-1];

r[i-1]=x;

}

}

4.快速排序:

首先选择一个基准,将记录分割为两部分,左支小于或等于基准,右支则大于基准,然后对两部分重复上述过程,直至整个序列排序完成

intPartion(intr[],intfirst,intend,int*compare,int*move)//快速排序中的轴定位

{inti=first;

intj=end;

intzhou=r[i];

//默认第一个元素为轴

while(i<

j)

while((i<

j)&

(r[j]>

=zhou))//查看右侧元素与轴的大小关系

j--;

if(i<

{(*compare)++;

r[i]=r[j];

//发现轴右侧的某数比轴值小,将其前置

}while((i<

(r[i]<

=zhou))//查看左侧元素与轴的大小关系{(*compare)++;

i++;

r[j]=r[i];

//发现轴左侧的某数比轴值小,将其后置

}

r[i]=zhou;

//最后确定轴的位置returni;

voidQsort(intr[],inti,intj,int*compare,int*move)//快速排序

{if(i<

{intcentre=Partion(r,i,j,compare,move);

Qsort(r,i,centre-1,compare,move);

Qsort(r,centre+1,j,compare,move);

5.选择排序:

从待排序的记录序列中选择关键码最小的记录并将它与序列中的第一个记录交换位置;

然后从不包括第一个位置上的记录序列中选择关键码最小(或最大)的记录并将它与序列中的第二个记录交换位置;

如此重复,直到序列中只剩下一个记录为止

voidSelectsort(intr[],intn,int*compare,int*move)//选择排序

{*compare=0;

for(inti=0;

i++)//排序n-1次

Intmin=i;

for(intj=i+1;

j++)//通过此层循环,找到真正的第i个最小值

{(*compare)++;

if(r[j]<

r[min])

min=j;

//记录下当前找到的最小值的位置

if(min!

=i)

{

intMin;

Min=r[min];

r[min]=r[i];

r[i]=Min;

时间复杂度,空间复杂度

排序方法

平均情况

最好情况

最坏情况

辅助空间

直接插入排序

O(n²

O(n)

O

(1)

希尔排序

O(nlog2n)~O(n)

O(n的1.3次幂)

起泡排序

快速排序

O(nlog2n)

O(log2n)~O(n)

简单选择排序

 

原始代码:

#include<

iostream>

usingnamespacestd;

voidInsertSort(intr[],intn)

{

intnum1=0;

intnum2=0;

for(inti=2;

i++)

{

r[i-1])

{

r[0]=r[i];

r[i]=r[i-1];

for(intj=i-1;

r[0]<

r[j];

j--,num1++)

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

num2=num2+3;

}

num1++;

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

}

}

cout<

<

"

直接插入排序后的数组为:

;

for(intk=1;

k<

k++)

cout<

r[k]<

"

endl;

比较次数为:

num1<

移动次数为:

num2<

voidShellSort(intr[],intn)

for(intd=n/2;

d=d/2)

for(inti=d+1;

if(r[i]<

r[i-d])

{

r[0]=r[i];

for(intj=i-d;

0&

j=j-d,num1++)

{r[j+d]=r[j];

num2=num2+3;

}

r[j+d]=r[0];

num1++;

希尔排序后的数组为:

voidBubbleSort(intr[],intn)

intpos=n;

while(pos!

=0)

intbound=pos;

pos=0;

for(inti=1;

bound-1;

if(r[i]>

r[i+1])

r[i]=r[i+1];

r[i+1]=r[0];

pos=i+1;

num2+=3;

}num1++;

冒泡排序后的数组为:

intPartion(intr[],intfirst,intend,int&

num1,int&

num2)

inti=first;

intj=end;

intpivot=r[i];

while(i<

{

while((i<

=pivot))

j--;

if(i!

=j)

=pivot)&

num1++)

i++;

r[j]=r[i];

if(i!

num2=num2+3;

r[i]=pivot;

returni;

voidQsort(intr[],inti,intj,int&

num2)

if(i<

intpivotloc=Partion(r,i,j,num1,num2);

Qsort(r,i,pivotloc-1,num1,num2);

Qsort(r,pivotloc+1,j,num1,num2);

voidSelectSort(intr[],intn)

intnum1=0,num2=0;

for(inti=1;

i++)

intindex=i;

for(intj=i+1;

j++,num1++)

if(r[j]<

r[index])

index=j;

if(index!

=i)

r[i]=r[index];

r[index]=r[0];

简单选择排序后的数组为:

voidRand(inta[],intr)

for(into=1;

o<

=10;

o++)

a[o]=rand();

voidmain()

正反序排序结果为:

intr[10]={0,1,3,5,7,9,11,13,15,17};

InsertSort(r,10);

intR[10]={0,17,15,13,11,9,7,5,3,1};

InsertSort(R,10);

inta[10]={0,2,4,6,8,10,12,14,16,18};

BubbleSort(a,10);

intA[10]={0,18,16,14,12,10,8,6,4,2};

BubbleSort(A,10);

intb[10]={0,3,6,9,12,15,18,21,24,27};

ShellSort(b,10);

intB[10]={0,27,24,21,18,15,12,9,6,3};

ShellSort(B,10);

intc[10]={0,1,2,3,4,5,6,7,8,9};

Qsort(c,1,10,num1,num2);

快速排序后的数组为:

=9;

c[k]<

intC[10]={0,9,8,7,6,5,4,3,2,1};

Qsort(C,1,10,num1,num2);

for(intq=1;

q<

q++)

C[q]<

intd[10]={0,1,3,8,99,444,456,568,888,997};

SelectSort(d,10);

intD[10]={0,997,888,568,456,444,99,8,3,1};

SelectSort(D,10);

intn[10]={0,0,0,0,0,0,0,0,0,0};

随机数组排序结果:

Rand(n,10);

InsertSort(n,10);

BubbleSort(n,10);

ShellSort(n,10);

Qsort(n,1,10,num1,num2);

for(intK=1;

K<

K++)

n[K]<

SelectSort(n,10);

总结:

这次排序总体比较简单,所以调试程序所用时间不长。

但是对结构还是不够熟练,对比较次数和移动次数的计数还存在一定问题。

流程图

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

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

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

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