数据结构实验报告六 排序

article/2025/10/4 18:04:16

一、实验目的

1、掌握内部排序的基本算法;
2、分析比较内部排序算法的效率。

二、实验内容和要求

1.运行下面程序:

#include <stdlib.h>
#include <stdio.h>
#define MAX 50
int slist[MAX]; /*待排序序列*/void insertSort(int list[], int n);
void createList(int list[], int *n);
void printList(int list[], int n);
void heapAdjust(int list[], int u, int v);
void heapSort(int list[], int n);/*直接插入排序*/
void insertSort(int list[], int n)
{int i = 1, j = 0, node = 0, count = 1;printf("对序列进行直接插入排序:\n");printf("初始序列为:");printList(list, n);for(i = 2; i <= n; i++){node = list[i];j = i - 1;while(j >= 0 && node < list[j]){list[j+1] = list[j];--j;}list[j+1] = node;printf("第%d次排序结果:", count++);printList(list, n);}
}
/*堆排序*/
void heapAdjust(int list[], int u, int v)
{int i = u, j , temp = list[i];j = 2 * i;while (j <= v){if(j < v && list[j] < list[j+1])j++; /*若右孩子较大,则把j修改为右孩子的下标*/if(temp < list[j]){list[i] = list[j]; /*将list[j]调到父亲的位置上*/i = j;j = 2 * i; /*修改i和j的值,以便继续向下筛选*/}elsebreak; /*筛选完成,终止循环*/}list[i] = temp; /*被筛结点的值放入最终位置*/
}
void heapSort(int list[], int n)
{int i = 0, temp = 0, count = 1;printf("对序列进行堆排序:\n");printf("初始序列为:");printList(list, n);for (i = n  / 2; i > 0; i--)heapAdjust(list, i, n); /*建立初始堆*/printf("建立的初始堆为:");printList(list, n);for(i = n ; i > 1; i--){/*循环,完成堆排序*/temp = list[1];list[1] = list[i];list[i] = temp; /*将第一个元素同当前区间内最后一个元素对换*/heapAdjust(list, 1 , i-1); /*筛选出list[1]结点*/printf("第%d次排序结果:", count++);printList(list, n);}
}
/*生成待排序序列*/
void createList(int list[], int *n)
{int i = 1,a;printf("请输入待排序序列(长度小于50,以输入一个字符结束):\n");while(scanf("%d",&a)==1){list[i] = a;i++;}*n=i-1;getchar();
}
/*输出排序结果*/
void printList(int list[], int n)
{int i = 1;for(; i <= n; i++){printf("  %d  ", list[i]);if(i % 10 ==0 && i != 0)printf("\n");}printf("\n");
}int main()
{int choice=1,length;while(choice!=0){printf("\n");printf("***** 内部排序算法演示程序 *****\n");printf("\n1. 直接插入排序 \n");printf("\n2. 堆排序 \n");printf("\n0. 退出\n");printf("\n请选择:");scanf("%d", &choice);getchar();switch(choice){case 1:{createList(slist, &length);insertSort(slist, length);break;}case 2:{createList(slist, &length);heapSort(slist, length);break;}default:choice=0;}printf("\n");}return 0;
}

输入待排序序列:49 38 65 97 13 27 49(以输入一个字符作为结束)

1) 直接插入排序运行结果(写出每一趟的状态):

对序列进行直接插入排序:
初始序列为: 49 38 65 97 13 27 49
第1次排序结果: 38 49 65 97 13 27 49
第2次排序结果: 38 49 65 97 13 27 49
第3次排序结果: 38 49 65 97 13 27 49
第4次排序结果: 13 38 49 65 97 27 49
第5次排序结果: 13 27 38 49 65 97 49
第6次排序结果: 13 27 38 49 49 65 97
实验六(1)

2)堆排序运行结果(写出每一趟的状态):

对序列进行堆排序:
初始序列为: 49 38 65 97 13 27 49
建立的初始堆为: 97 49 65 38 13 27 49
第1次排序结果: 65 49 49 38 13 27 97
第2次排序结果: 49 38 49 27 13 65 97
第3次排序结果: 49 38 13 27 49 65 97
第4次排序结果: 38 27 13 49 49 65 97
第5次排序结果: 27 13 38 49 49 65 97
第6次排序结果: 13 27 38 49 49 65 97
实验六(2)

2、在1题中补充希尔排序算法。

算法代码:
void shellSort(int list[], int n)
{int i,j,d,temp,count=1;printf("对序列进行希尔排序:\n");printf("初始序列为:");printList(list, n);for(d=n/2;d>0;d/=2){for(i=d+1;i<=n;i++){temp=list[i];j=i-d;while(j>=1&&temp<list[j]){list[j+d]=list[j];j=j-d;}list[j+d]=temp;}printf("第%d次排序结果:", count++);printList(list, n);}
}

输入待排序序列:49 38 65 97 13 27 49(以输入一个字符作为结束)

运行结果(写出每一趟的状态):

对序列进行希尔排序:
初始序列为: 49 38 65 97 13 27 49
第1次排序结果: 49 13 27 49 38 65 97
第2次排序结果: 13 27 38 49 49 65 97
实验六(3)

3、在1题中补充快速排序算法。

算法代码:
int count=1;
int Partition(int list[], int i, int j, int n)
{list[0]=list[i];int pivotkey=list[i];while(i<j){while(i<j&&list[j]>=pivotkey)--j;list[i]=list[j];while(i<j&&list[i]<=pivotkey)++i;list[j]=list[i];}list[i]=list[0];printf("第%d次排序结果:", count++);printList(list, n);return i;
}
void quickSort(int list[], int i, int j, int n)
{int pivot;if(i<j){pivot=Partition(list, i, j, n);quickSort(list,i,pivot-1,n);quickSort(list,pivot+1,j,n);}
}

输入待排序序列:49 38 65 97 13 27 49(以输入一个字符作为结束)

运行结果(写出每一趟的状态):

对序列进行快速排序:
初始序列为: 49 38 65 97 13 27 49
第1次排序结果: 27 38 13 49 97 65 49
第2次排序结果: 13 27 38 49 97 65 49
第3次排序结果: 13 27 38 49 49 65 97
第4次排序结果: 13 27 38 49 49 65 97
实验六(4)

三、补充后完整代码

#include <stdlib.h>
#include <stdio.h>
#define MAX 50
int slist[MAX]; /*待排序序列*/void insertSort(int list[], int n);
void createList(int list[], int *n);
void printList(int list[], int n);
void heapAdjust(int list[], int u, int v);
void heapSort(int list[], int n);
void shellSort(int list[], int n);
int Partition(int list[], int i, int j, int n);
void quickSort(int list[], int i, int j, int n);/*直接插入排序*/
void insertSort(int list[], int n)
{int i = 1, j = 0, node = 0, count = 1;printf("对序列进行直接插入排序:\n");printf("初始序列为:");printList(list, n);for(i = 2; i <= n; i++){node = list[i];j = i - 1;while(j >= 0 && node < list[j]){list[j+1] = list[j];--j;}list[j+1] = node;printf("第%d次排序结果:", count++);printList(list, n);}
}
/*堆排序*/
void heapAdjust(int list[], int u, int v)
{int i = u, j, temp = list[i];j = 2 * i;while (j <= v){if(j < v && list[j] < list[j+1])j++; /*若右孩子较大,则把j修改为右孩子的下标*/if(temp < list[j]){list[i] = list[j]; /*将list[j]调到父亲的位置上*/i = j;j = 2 * i; /*修改i和j的值,以便继续向下筛选*/}elsebreak; /*筛选完成,终止循环*/}list[i] = temp; /*被筛结点的值放入最终位置*/
}
void heapSort(int list[], int n)
{int i = 0, temp = 0, count = 1;printf("对序列进行堆排序:\n");printf("初始序列为:");printList(list, n);for (i = n  / 2; i > 0; i--)heapAdjust(list, i, n); /*建立初始堆*/printf("建立的初始堆为:");printList(list, n);for(i = n ; i > 1; i--){/*循环,完成堆排序*/temp = list[1];list[1] = list[i];list[i] = temp; /*将第一个元素同当前区间内最后一个元素对换*/heapAdjust(list, 1, i-1);  /*筛选出list[1]结点*/printf("第%d次排序结果:", count++);printList(list, n);}
}
/*希尔排序*/
void shellSort(int list[], int n)
{int i,j,d,temp,count=1;printf("对序列进行希尔排序:\n");printf("初始序列为:");printList(list, n);for(d=n/2; d>0; d/=2){for(i=d+1; i<=n; i++){temp=list[i];j=i-d;while(j>=1&&temp<list[j]){list[j+d]=list[j];j=j-d;}list[j+d]=temp;}printf("第%d次排序结果:", count++);printList(list, n);}
}
/*快速排序*/
int count=1;
int Partition(int list[], int i, int j, int n)
{list[0]=list[i];int pivotkey=list[i];while(i<j){while(i<j&&list[j]>=pivotkey)--j;list[i]=list[j];while(i<j&&list[i]<=pivotkey)++i;list[j]=list[i];}list[i]=list[0];printf("第%d次排序结果:", count++);printList(list, n);return i;
}
void quickSort(int list[], int i, int j, int n)
{int pivot;if(i<j){pivot=Partition(list, i, j, n);quickSort(list,i,pivot-1,n);quickSort(list,pivot+1,j,n);}
}
/*生成待排序序列*/
void createList(int list[], int *n)
{int i = 1,a;printf("请输入待排序序列(长度小于50,以输入一个字符结束):\n");while(scanf("%d",&a)==1){list[i] = a;i++;}*n=i-1;getchar();
}
/*输出排序结果*/
void printList(int list[], int n)
{int i = 1;for(; i <= n; i++){printf("  %d  ", list[i]);if(i % 10 ==0 && i != 0)printf("\n");}printf("\n");
}int main()
{int choice=1,length;while(choice!=0){printf("\n");printf("***** 内部排序算法演示程序 *****\n");printf("\n1. 直接插入排序 \n");printf("\n2. 堆排序 \n");printf("\n3. 希尔排序 \n");printf("\n4. 快速排序 \n");printf("\n0. 退出\n");printf("\n请选择:");scanf("%d", &choice);getchar();switch(choice){case 1:{createList(slist, &length);insertSort(slist, length);break;}case 2:{createList(slist, &length);heapSort(slist, length);break;}case 3:{createList(slist, &length);shellSort(slist, length);break;}case 4:{createList(slist, &length);printf("对序列进行快速排序:\n");printf("初始序列为:");printList(slist, length);quickSort(slist, 1, length, length);break;}default:choice=0;}printf("\n");}return 0;
}

http://chatgpt.dhexx.cn/article/ssM8goRy.shtml

相关文章

数据结构实验——哈夫曼编码

目录 问题描述 基本要求 问题分析 实验代码 运行结果 实验总结 问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率&#xff0c;缩短信息传输时间&#xff0c;降低传输成本。但是&#xff0c;这要求在发送端通过一个编码系统对待传数据预先编码&#xff0c;在接收端…

数据结构实验C语言实现版

目录 数据结构实验——顺序表的基本操作 数据结构实验——单链表的基本操作 数据结构实验——顺序栈的建立及基本操作实现 数据结构实验——链队列的建立及基本操作实现 数据结构实验——赫夫曼树构造及赫夫曼编码的实现 数据结构实验——迪杰斯特拉算法求最短路径 数据结…

数据结构实验报告

数据结构与算法实验一&#xff08;顺序表的操作&#xff09; 一、实验目的 1&#xff0e;掌握线性表的顺序存储结构的表示和实现方法。 2&#xff0e;掌握顺序表基本操作的算法实现。 3&#xff0e;了解顺序表的应用。 二、实验内容 1&#xff0e;建立顺序表。 2&#xff0…

【数据结构】实验项目:顺序表,也就那么回事

目录 序 嗨&#xff0c;这里是狐狸~~ 简介 顺序表的结构定义&#xff1a; 声明顺序表类型变量&#xff1a; 实验内容&#xff1a; 实验说明 : 实验思路 1、 输入一组整型元素序列&#xff08;不少于10个&#xff09;&#xff0c;建立顺序表。 2&#xff0e; 在该顺…

数据结构(实验一)

第一次写报告&#xff0c;虽然有点简单&#xff0c;但还是要勉励自己再接再厉。加油 继续努力。 1.实验目的&#xff08;结出本次实验所涉及并要求掌握的知识点&#xff09; 1.掌握顺序表的存储结构形式及描述方法和基本运算的实现&#xff1b; 2.掌握用顺序表设计合理的数据…

数据结构实验

1.有序数组的插入 代码&#xff1a; bool Insert( List L, ElementType X ){//溢出if(L->LastMAXSIZE-1) return false;//插入在最后一位if(L->Data[L->Last] > X){L->Data[L->Last1]X;L->Last;return true;}int tp0;int find0;int tmp0;for(int i0;i &l…

网络传输大文件使用什么软件可以高速传输?

网络传输大文件使用什么软件可以高速传输&#xff1f;通过网络传输文件总是在速度上得不到很好的体现&#xff0c;更不用说是传输大文件了。本身支持大文件网络传输的工具就是不是很多&#xff0c;很多的传输工具对文件的大小都有所限制&#xff0c;要是想要找到一个高速传输大…

.mmap文件用什么软件可以打开?

1.下载MindManager专属打开它的软件 2。

什么是Saas软件?

人们常常会提及Saas&#xff08;萨斯&#xff09;软件&#xff0c;那么什么是Saas软件呢&#xff1f;首先大家通过百度可以看到百度百科的解释 相信大多数的伙伴们看了之后的感想就是一脸蒙圈&#xff0c;如果让自己给别人介绍什么是Saas软件还是记不住解释不清楚&#xff0c;那…

测试移动信号频率的软件,手机信号工作频段侦测软件

手机信号来源于基站发射的信号。但是常常会遇见的手机信号差&#xff0c;信号弱&#xff0c;上网速度慢等&#xff0c;都有可能是源于信号弱带来的。那么我们看见的手机上显示的信号弱&#xff0c;到底是什么信号弱&#xff1f;如何判别&#xff1f; 这里推荐一款APP软件&#…

杀毒软件可以查杀所有计算机病毒吗,杀毒软件可以查杀所有病毒吗

杀毒软件包括电脑杀毒软件和手机杀毒软件&#xff0c;那么杀毒软件可以查杀所有病毒吗&#xff1f;目前&#xff0c;做到所有病毒查杀还没有一家杀毒软件敢100%保证&#xff0c;因为电脑病毒也在日新月异的发展着&#xff0c;那是不是新病毒就查杀不了呢&#xff1f;也不是&…

可以测试电脑网络速度的软件,介绍4种有用的Internet Speed软件应用程序,用于测试网络速度软件...

当今社会将使用Internet&#xff0c;但是Internet的速度极大地影响了我们的工作和浏览. 在玩游戏和观看视频时测网速什么软件好&#xff0c;拥有一个良好的Internet甚至更为必要. 目前&#xff0c;我们可以使用Internet速度测试软件进行测试. 网络的速度和稳定性使您可以更好地…

什么软件可以测试鬼,PP助手新奇App推荐 《鬼魂探测器》能抓鬼?

最近&#xff0c;小伙伴们迷上了一款奇葩App&#xff0c;据说可以将潜伏在你周围的“阿飘”揪出来。这款软件就是《鬼魂探测器》&#xff0c;听起来是不是有点毛骨悚然&#xff0c;但又忍不住好奇心&#xff0c;通过PP助手下载一探究竟吧。 图1&#xff1a;PP助手(Win)2.0 只要…

测试电脑整机功耗软件,有什么好的测电脑整机功耗的软件吗?

很多人都说电脑的速度越快耗电量就越快&#xff0c;早期的486和现在的P4相比&#xff0c;那简直就是“节能电脑”了&#xff0c;那么想不想知道你的电脑到底有耗电量是多少呢&#xff1f;来试试Overclockulator吧&#xff0c;根据你的选择它可以估算出一台电脑的耗电量。 该软件…

有没有测试颜色的软件,用什么软件测试显示器色彩最准:色彩校正软件

用什么软件测试显示器色彩最准&#xff1a;1.iphone直接显示器校色&#xff0c;这个估计是最有效的方法。有的人可能用不惯iphone的界面&#xff0c;我经常用iphone来测试工程数据&#xff0c;因为iphone有自己的屏幕校色传感器&#xff0c;而iphone的屏幕比一般的显示器都要准…

java用什么软件_Java编程什么软件最好用?

原标题&#xff1a;Java编程什么软件最好用&#xff1f; “工欲善其事必先利其器”&#xff0c;想要学好Java编程开发&#xff0c;除了要有好的学习资源之外&#xff0c;还要有一套适合自己的Java编程软件&#xff0c;好的编程软件能极大提高你的学习和工作效率。那么&#xff…

kml用什么软件打开?

下载安装 bigemap GIS office软件&#xff08;免费就可以) 2、 安装好下载的bigemap软件&#xff0c;直接将kml kmz拖到软件里面就打开了&#xff0c;或者左上角文件打开 选择 kml/kmz 然后选择你的文件 打开记性了。 BIGEMAP支持所有文件格式的打开和保存&#xff0c;如…

可以测试英语发音的软件,检测英语发音的软件

目录 一、音标软件 ①.同求!!!和外国人多说说话。 ②.百度里打“朗酷口语”就可以了~~ 这 个软件可以的!俺也用~~~ 哈哈祝你好运~~。 ③.你好,你说的就跟复读机是一个道理。这种软件不过就是对于人的音频和关键点做了一个发音的匹配度测试,语音库会先前录好没一个单词的发…

测试显卡用什么软件最好,显卡测试用什么软件 怎么测试显卡性能

如果要精确的测试一块显卡的性能则需要一款专业的显卡测试软件,显卡测试用什么软件?像3dmark 11、built-in benchmark tool、gpu-z等软件都是相当优秀的显卡测试软件,另外的测试就是烤机了,可以利用furmark软件烤机测试显卡性能。今天小编就为大家介绍显卡测试的方法。 什么…

有什么软件可以直接拒接所有骚扰电话?3款App让你不再为骚扰电话烦恼

现在大部分智能手机都有自带的拦截功能&#xff0c;可以自动标记可疑的来电号码、对垃圾短信也能起到拦截作用。如果你的手机没有这种功能&#xff0c;也可以下载第三方安全软件进行拦截。 熊猫吃短信app&#xff1a;点击左侧链接下载 熊猫吃短信app是一款值得推荐的垃圾短信过…