您的当前位置:首页正文

数据结构内部排序算法比较

2020-02-09 来源:星星旅游


内部排序算法比较

第一章 问题描述

排序是数据结构中重要的一个部分,也是在实际开发中易遇到的问题,所以研究各种排算法的时间消耗对于在实际应用当中很有必要通过分析实际结合算法的特性进行选择和使用哪种算法可以使实际问题得到更好更充分的解决!该系统通过对各种内部排序算法如直接插入排序,冒泡排序,简单选择排序,快速排序,希尔排序,堆排序、二路归并排序等,以关键码的比较次数和移动次数分析其特点,并进行比较,估算每种算法的时间消耗,从而比较各种算法的优劣和使用情况!排序表的数据是多种不同的情况,如随机产生数据、极端的数据如已是正序或逆序数据。比较的结果用一个直方图表示。

第二章 系统分析 界面的设计如图所示:

|******************************|

|-------欢 迎 使 用---------| |-----(1)随 机 取 数-------|

1

|-----(2)自 行 输 入-------| |-----(0)退 出 使 用-------| |******************************|

请 选 择 操 作 方 式:

如上图所示该系统的功能有:

(1):选择1 时系统由客户输入要进行测试的元素个数由电脑随

机选取数字进行各种排序结果得到准确的比较和移动次数并打印出结果。

(2)选择2 时系统由客户自己输入要进行测试的元素进行各种

排序结果得到准确的比较和移动次数并打印出结果。 (3)选择0 打印“谢谢使用!!”退出系统的使用!!

第三章 系统设计

(I) 友好的人机界面设计:(如图3.1所示)

|******************************| |-------欢 迎 使 用---------| |-----(1)随 机 取 数-------|

|-----(2)自 行 输 入-------| |-----(0)退 出 使 用-------| |******************************|

(3.1)

(II)方便快捷的操作:用户只需要根据不同的需要在界面上输入系统提醒的操作形式直

接进行相应的操作方式即可!如图(3.2所示)

|******************************| |-------欢 迎 使 用---------| |-----(1)随 机 取 数-------|

|-----(2)自 行 输 入-------| |-----(0)退 出 使 用-------|

2

|******************************|

请 选 择 操 作 方 式:(用户在此输入操作方式) (3.2)

(III)系统采用定义结构体数组来存储数据 。 (IV)功能介绍:

(1)操作功能:a .当用户选择随即电脑随机取数时

系统将弹出——>请输入你要输入的个数 :(用户在此输入要电脑取数的个数) 要是用户输入的数据过大系统将提醒错误——>超出范围重新输入 b . .当用户选择自行输入时

系统将弹出——>请输入你要输入的个数(不大于于30的整数):

当用户输完元素的个数之后系统将提示用户依次输入各个元素。 ——>请输入各个元素:

(2) 排序功能:系统有 简单选择排序,冒泡排序,堆排序,二路归并排序,快速

排序的功能。

(3)打印清晰:系统会打印出在排序操作之前电脑随机取数或者用户输入的原始

排列顺序;并将排序操作之后的有序数据打印在原始数据的下面以便用户的对比。在排序操作结束之后系统将以直方图的形式打出排序过程中比较和移动次数让客户一目了然地看到排序的结果: 比 较 结 果 排序方式 直 接 简单选择 冒 泡 堆 排 序 直 接 快 速 比较次数 移动次数

第四章 系统实现

(一)定义结构体数组: typedef struct { int key; } datatype;

datatype R[MAXNUM];//定义结构体数组 (二)直接排序:

3

void D_InsertSort(datatype R[ ], int n)//直接排序 {

int i,j;

for(i=2; i<=n; i++) { cn[0]++;

if (R[i].keyfor(j=i-1; R[0].keyR[j+1]=R[0]; mn[0]+=2; } } }

(三)简单选择排序:

void Select_Sort(datatype R[ ],int n)//简单选择排序 {

int i,j,k;

for(i=1;iif (i=k)

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

R[i]=R[0]; mn[1]+=3; } } }

(四)冒泡排序:

void Bubble_Sort (datatype R[ ], int n)//冒泡排序 {

int i, j; int swap;

for(i=1; i4

{swap=0;

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

cn[2]++;

if (R[j].keyR[j+1]=R[0]; mn[2]+=3; swap=1; }}

if(swap==0) break; } }

(五)堆排序:

void HeapAdjust(datatype R[ ], int s, int t) {

datatype rc; int i,j ; rc=R[s]; i=s;

for(j=2*i; j<=t; j=2*j)

{ cn[3]++;

if(j R[j].key) break; R[i]=R[j]; mn[3]++; i=j; } R[i]=rc; }

void HeapSort(datatype R[ ], int n)//堆排序 { int i;

for(i=n/2; i>0; i-- ) HeapAdjust(R, i, n); for(i=n; i>1; i--) { R[0]=R[1]; R[1]=R[i];

R[i]=R[0]; mn[3]+=3; HeapAdjust(R,1, i-1);

5

} }

(六)归并排序:

void Merge(datatype R[ ], datatype R1[ ], int s, int m , int t) {

int i,j,k;

i=s; j=m+1; k=s; while (i<=m&&j<=t) {

cn[4]++;

if(R[i].key{ R1[k++]=R[i++]; mn[4]++;} else { R1[k++]=R[j++]; mn[4]++;} }

while (i<=m) { R1[k++]=R[i++]; mn[4]++; } while (j<=t) { R1[k++]=R[j++]; mn[4]++;} }

void MSort(datatype R[ ], datatype R1[ ], int s, int t) {

int m;

if(s==t) { R1[s]=R[s]; mn[4]++;} else {m=(s+t)/2;

MSort(R, R1, s, m); MSort(R, R1, m+1, t); Merge(R1, R, s, m, t); } }

void MergeSort(datatype R[ ], datatype R1[ ], int n)//归并排序 {

MSort(R, R1,1, n); }

int Partition(datatype R[ ], int low, int high) {

R[0]=R[low]; mn[5]++; while(low=R[0].key) {cn[5]++; high--;} if(low6

}

R[low]=R[0]; mn[5]++; return low; }

(七)快速排序:

void Quick_Sort(datatype R[ ], int s, int t)//快速排序 {

int i; if( si = Partition(R, s, t); Quick_Sort(R, s, i-1); Quick_Sort(R, i+1, t); } }

void prin(datatype R[],int n) {

int i ;

printf(\"排序的结果为:\"); for(i=1;i<=n;i++) printf(\"%d \ printf(\"\\n \");

} (八)电脑随机取数: void sui_ji() {

int i,n;

datatype R[MAXNUM]={0};

a: printf(\"请输入你要输入的个数:\"); scanf(\"%d\ if(n>25) {

printf(\"超出范围重新输入\\n\"); goto a; }

addlist(R,n);

printf(\"排序前元素顺序为:\");

for(i=1;iD_InsertSort(R,n);//直接排序 prin(R,n);

Select_Sort(R,n);//简单选择排序

7

Bubble_Sort(R, n);//冒泡排序 HeapSort(R, n);//堆排序

datatype R1[MAXNUM]={0};

MergeSort(R, R1, n);//二路归并排序 Quick_Sort(R,0, n);//快速排序

}

(九)用户自行输入: void zixing_input() { int n,i;

datatype R1[MAXNUM]={0};

printf(\"请输入你要输入的个数(不大于于30的整数):\"); scanf(\"%d\

printf(\"请输入各个元素:\"); for(i=1;iscanf(\"%d\ printf(\"排序前元素顺序为:\");

for(i=1;iD_InsertSort(R1,n);//直接排序 prin(R1,n);

Select_Sort(R1,n);//简单选择排序 Bubble_Sort(R1, n);//冒泡排序 HeapSort(R1, n);//堆排序 datatype R2[MAXNUM]={0};

MergeSort(R1, R2, n);//二路归并排序 Quick_Sort(R1,0, n);//快速排序

}

(十)主函数调用:

int main(void) {

int s;

printf(\" |******************************|\\n\"); printf(\" |-------欢 迎 使 用-----------------|\\n\"); printf(\" |-----(1)随 机 取 数-------------|\\n\"); printf(\" |-----(2)自 行 输 入-------------|\\n\"); printf(\" |-----(0)退 出 使 用-------------|\\n\"); printf(\" |******************************|\\n\"); printf(\" 请 选 择 操 作 方 式: \"); scanf(\"%d\ switch(s) {

8

case 1: system(\"cls\") ; sui_ji(); break;

case 2: system(\"cls\") ; zixing_input(); break; case 0: printf(\" 谢谢使用!! \"); exit(0); break;

}

printf(\"\\n \");

printf(\" 比 较 结 果 \\n\"); printf(\" \\n\");

printf(\" 排序方式 printf(\" \\n\");

printf(\" 直 接 printf(\" \\n\");

printf(\" 简单选择 printf(\" \\n\");

printf(\" 冒 泡 printf(\" \\n\");

printf(\" 堆 排 序 printf(\" \\n\");

printf(\" \\n\

printf(\" \\n\");

printf(\" \\n\

}

第五章 系统测试

(一) 随机取数的测试:

比较次数 %d %d %d %d 二路归并 快 速 9

移动次数\\n\"); %d %d %d %d %d %d \\n\\\n\\\n\\\n\

%d %d

(二)自行输入的测试:

10

(三)退出系统:

(四)时间的估算: 排序方法 直 接 简单选择 冒 泡 堆 排 序 直 接 快 速

11

平均时间性能 O(n2) O(n2) O(n2) O(nlog2 n) O(nlog2 n) O(nlog2 n) 最好时间性能 O(n) O(n) O(n) O(nlog2 n) O(nlog2 n) O(nlog2 n) 最坏时间性能 O(n2) O(n2) O(n2) O(nlog2 n) O(nlog2 n) O(nlog2 n)

12

因篇幅问题不能全部显示,请点此查看更多更全内容