数据结构内部排序实验报告

问题描述

数据结构内部排序实验报告

一、实验目的
1、掌握排序的有关概念和特点。
2、熟练掌握直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序等算法的基本思想。。
3、关键字序列有序与无序,对于不同的排序方法有不同的影响,通过该实验进一步加深理解。
二、实验内容
设有关键字序列k={ 12 , 45 , 21 , 12 , 30 , 2 , 68 , 33 },试用各种排序算法进行排序。
三、实验环境
TC或VC++
四、实验步骤
1、从键盘输入上述8个整数,存放在数组quick[8]中,并输出值。
2、输出各种排序算法每一趟排序的结果,观察关键字次序的变化。
(1)直接插入排序算法如下:
void InsertionSort ( SqList &L ) {
// 对顺序表 L 作直接插入排序。
for ( i=2; i<=L.length; ++i )
if (L.r[i].key < L.r[i-1].key) {
L.r[0] = L.r[i]; // 复制为监视哨
for ( j=i-1; L.r[0].key < L.r[j].key; -- j )
L.r[j+1] = L.r[j]; // 记录后移
L.r[j+1] = L.r[0]; // 插入到正确位置
}
} // InsertSort
(2)希尔排序算法如下:
void ShellInsert ( SqList &L, int dk ) {
for ( i=dk+1; i<=n; ++i )
if ( L.r[i].key< L.r[i-dk].key) {
L.r[0] = L.r[i]; // 暂存在R[0]
for (j=i-dk; j>0&&(L.r[0].key
j-=dk)
L.r[j+dk] = L.r[j]; // 记录后移,查找插入位置
L.r[j+dk] = L.r[0]; // 插入
} // if
} // ShellInsert
void ShellSort (SqList &L, int dlta[], int t)
{ // 增量为dlta[]的希尔排序
for (k=0; k
ShellInsert(L, dlta[k]);
//一趟增量为dlta[k]的插入排序
} // ShellSort
(3)冒泡排序算法如下:
void BubbleSort(Elem R[ ], int n) {
i = n;
while (i >1) {
lastExchangeIndex = 1;
for (j = 1; j < i; j++)
if (R[j+1].key < R[j].key) {
Swap(R[j], R[j+1]);
lastExchangeIndex = j; //记下进行交换的记录位置
} //if
i = lastExchangeIndex;
} // while
} // BubbleSort
(4)快速排序算法如下:
int Partition (RedType R[], int low, int high) {
R[0] = R[low]; pivotkey = R[low].key; // 枢轴

while (low
while(low=pivotkey)
-- high; // 从右向左搜索
R[low] = R[high];
while (low
++ low; // 从左向右搜索
R[high] = R[low];
}
R[low] = R[0]; return low;
}// Partition
void QSort (RedType & R[], int s, int t ) {
// 对记录序列R[s..t]进行快速排序
if (s
pivotloc = Partition(R, s, t); // 对 R[s..t] 进行一次划分
QSort(R, s, pivotloc-1);
QSort(R, pivotloc+1, t);
}
} // QSort
(5)简单选择排序的算法描述如下:
void SelectSort (Elem R[], int n ) {
// 对记录序列R[1..n]作简单选择排序。
for (i=1; i
j = SelectMinKey(R, i); // 在 R[i..n] 中选择关键字最小的记录
if (i!=j) R[i]←→R[j]; // 与第 i 个记录交换
}
} // SelectSort
(6)堆排序算法描述如下:
void HeapSort ( HeapType &H ) {
// 对顺序表 H 进行堆排序
for ( i=H.length/2; i>0; --i )
HeapAdjust ( H.r, i, H.length ); // 建大顶堆
for ( i=H.length; i>1; --i ) {
H.r[1]←→H.r[i];

HeapAdjust(H.r, 1, i-1); // 对 H.r[1] 进行筛选
}
} // HeapSort
void HeapAdjust (RcdType &R[], int s, int m)
{

rc = R[s]; // 暂存 R[s]
for ( j=2*s; j<=m; j*=2 ) { // j 初值指向左孩子
if ( j
if ( rc.key >= R[j].key ) break;
R[s] = R[j]; s = j;

}
R[s] = rc;

} // HeapAdjust
(7)归并排序算法描述如下:
void Msort ( RcdType SR[],

RcdType &TR1[], int s, int t ) {
// 将SR[s..t] 归并排序为 TR1[s..t]
if (s= =t) TR1[s]=SR[s];
else
{
m = (s+t)/2;
Msort (SR, TR2, s, m); // 递归地将SR[s..m]归并为有序的TR2[s..m]
Msort (SR, TR2, m+1, t);
Merge (TR2, TR1, s, m, t);
}
} // Msort
3、如果上述8个整数按照升序输入,即k1={ 2 , 12 , 12 , 21 , 30 , 33 , 45 , 68 },输出各种排序算法每一趟排序的结果,观察关键字次序的变化。
4、如果上述8个整数按照降序输入,即k2={ 68 , 45 , 33 , 30 , 21 , 12 , 12 , 2},输出各种排序算法每一趟排序的结果,观察关键字次序的变化。
5、随机产生3万个数,对其进行排序,观察其结果,并测试各排序算法的执行时间,比较执行效率。
五、问题讨论
1、直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序中哪些是稳定的排序方法,哪些是不稳定的?
2、直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序中哪些排序方法比较次数与初始序列有关,那些无关?
3、在初始序列基本有序的前提条件下,哪种排序方法效率最高?
六、实验报告内容
1、实验目的
2、实验内容和具体要求
3、完成情况和实验记录,实验记录为实验过程中遇到的问题及解决方法
4、程序清单
5、所输入的数据及相应的运行结果
6、问题回答
7、实验心得

解决方案

网上有类似代码,对所有排序的算法写一遍然后每次运行都是有时间统计的,你去下载来改改应该就可以完成这个报告了。 = =我的数据机构期末作业就这么弄弄,糊弄过去了。。。

时间: 2024-12-31 20:21:19

数据结构内部排序实验报告的相关文章

数据结构教程 第三十七课 实验八 排序实验

教学目的: 掌握简单插入排序.快速排序.堆排序的算法并加以应用. 教学重点: 教学难点: 授课内容: 实现下述三种算法,并用以下无序序列加以验证: 49,38,65,97,76,13,27,49 一.简单插入排序 二.快速排序 三.堆排序 以上算法的C源程序. #define MAXSIZE 20 #define LT(a,b) ((a)<(b)) typedef int KeyType; typedef int InfoType; typedef struct{ KeyType key; In

内部排序——希尔插入排序

直接插入排序在时间复杂度上优势不明显.达到O(n2)的水平了,所以需要想办法降低时间复杂度是很有必要的.当记录的排序就是所求的排序时,时间复杂度会大幅下降,为O(n).这是最理想的状态,当顺序刚好是逆序的时候,时间复杂度最大为O(n2).所以记录越是有序,时间复杂度越低.这个和快速排序不同,大家都知道快速排序在有序的情况下效果是很差的吧. 现在的问题是,如何使得记录变得有序,这个也是我们求的最后结果.希尔排序是一种很好的选择,它的原理是使得记录大体上有序,虽然不是所有都有序,但是大体上有序也是很

博客炒作之实验报告

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 实验方法与步骤: 1.对部分人气超高博客进行分析.发现博客人气高,主要有以下几种情况:明星博客,领域专家博客,热点文章,有背景(有些博客被莫名其妙贴在新浪博客首页,不是什么名人也没有什么内容).博客博客,博取来客,我只有依靠热点文章来博取人气了. 2.选择热点.热点有很多:时事,文化,教育,娱乐,财经.关注面广泛,能够引起争论的话题最能在短时

内部排序算法的总结

内部排序总结 这篇博文我们简要地总结下各种内部排序方法. 这10种排序算法中,前面7种属于建立在"比较"基础上的排序算法,通过决策树已经证明,任何基于比较进行的排序算法的时 间复杂度不可能再优于O(n*logn).后面3种不是建立在比较的基础上的,因此,可以达到线性运行时间. 下面我们给出各种排序方法的时空复杂度的表格(属于自己总结,有不对的地方,希望大家指正或补充). 返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/Program

内部排序:计数排序、基数排序和桶排序

前言 最后三种排序算法了,由于都不是基于比较的排序,因此这三种排序算法可以以线性时间运行.但是因为限制条件的特殊性,因此应用面没有基于元素比较的排序算法广,但是在很多特定的情况下还是蛮有用途的,而且效率极高. 计数排序 计数排序是建立在这样的前提条件下的:假设n个输入元素的每一个都是0到k区间内的一个整数,其中k为某个整数.因此我们后面所写的程序也只是针对0到k之间的元素进行排序,换句话说,排序元素中不能有负数. 计数排序的基本思想是:对一个输入元素x,先确定所有输入元素中小于x的元素个数,那么

内部排序:插入排序和希尔排序的N种实现

前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃了这个念头,斟前酌后,还是觉得分开来写比较好,具体原因,看完本篇博文也就自然明了了. 本篇文章主要探讨插入排序和希尔排序,之所将二者放在一起,很明显,是因为希尔排序是建立在插入排序的基础之上的. 注:以下各排序算法的N种实现方法大部分都是我根据算法思想,自己写出来的,或者是参考其本身的经典实现,我自己都已测试通过,但不敢保证一定都没问题,如果有疑问,欢迎指出. 插入排序 插入排序的思想很简单,它的基本操作就是将一个数据插入到

面向对象实验报告二

面向对象分析与设计第二次实验报告   一.类的不同类型的方法,属性的可见性   可见/访问性 在同一类中 同一包中 不同包中  同一包子类中  不同包子类中   public  yes  yes  yes  yes  yes  protected   yes  yes  no  yes  yes  package   yes  yes  no  yes  no  private  yes  no  no  no  no public  class Student {     public Str

各位能不能提供一个MFC框架的C++计费系统,要是完整的实验报告和可直接运行的代码,希望大神帮帮忙吧

问题描述 各位能不能提供一个MFC框架的C++计费系统,要是完整的实验报告和可直接运行的代码,希望大神帮帮忙吧 高手有赏追加30金币,说到做到,为了应付学校的生产实习来着,还请各位理解............................................ 解决方案 那你google下吧,只是一个现成的报告,自己找找.我要睡觉了,懒得帮你了. 解决方案二: 一般代写论文是300~500每篇,折合成"金币"大约是6000~10000,而且因为"金币"没

行人统计 —— AdaBoost头部分类器的训练 实验报告 代码 样本

pdf 代码 样本 下载             行人统计 -- AdaBoost头部分类器的训练 实验报告 代码 样本