快速排序报告

快速排序报告
快速排序报告

《数据结构课程设计》报告

题目:快速排序问题

专业 计算机科学与技术

学生姓名 高海松 班级 B 计116 学

1110704605 指导教师 巩永旺 完成日期

2013年1月11日

目录

1简介 (3)

2算法说明 (5)

3测试结果 (6)

4分析与探讨 (8)

5小结 (11)

附录:源程序清单 (11)

一、简介

1、排序及排序算法类型

排序是数据处理领域和软件设计领域中一种常见而重要的运算。排序就是将一组记录(元素)的任意序列按照某个域的值的递增(从小到大)或递减(由大到小)的次序重新排列的过程。排序的目的之一就是为了方便查找。排序分为内部排序和外部排序。在内存中进行的排序叫内部排序,利用外部存储的排序叫外部排序。

内部排序的方法有很多,但就其全面性能而言,很难提出一种被认为是最好的方法,每一种方法都有各自的缺点,适合在不同的环境下使用。按照其策略不同,可归纳为五类:插入排序、交换排序、选择排序、归并排序和基数排序。

2、快速排序算法介绍

快速算法就像是它的名称所暗示的,是一种快速的分而治之的算法,平均时间复杂度为O(nlog2n)。它的速度主要归于一个非常紧凑并且高度优化的内部循环。其基本算法Quicksort(S)由以下4个步骤组成:

(1)如果S中的元素的个数为0或1 ,则返回。

(2)选择S中的任意一个元素v,v叫做支点(Pivot).

(3)将S—{v}(剩下的元素在S中)分成两个分开的部分。L={x∈S—{v}|x ≦v}和R={x∈S-{v}|x≧v}。

(4)依次返回Quicksort(L)、v和Quicksort(R)的结果。

基本的快速排序算法可以应用递归实现,关键的细节包括支点的选择和如何分组。

该算法允许把任何元素作为支点。支点把数组分为两组:小于支点的元素和大于支点的元素集。

图1展示了一组数据进行快速排序的基本过程。

3、快速排序的分析

(1)最好情况:快速排序的最好情况是支点把集合分成两个同等大小的子集,并且在递归的每个阶段都这样划分。然后就有了两个一般大小的递归调用和线性的分组开销。在这种情况下运行的时间复杂度是O(nlog2n)。

(2)最坏情况:假设在每一步的递归调用中,支点都恰好是最小的元素。这样小元素的集合L就是空的,而大元素集合R拥有除了支点以外的所有元素。设T(N)是对N各元素惊醒快速排序所需的运行时间按,并假设对0或1各元素排序的时间刚好是1个时间单位。那么对由于N》1,当每次都运气很差地最小的元素作为支点,得到的原型时间满足T(N)=T(N-1)+N.即对N各项进行排序的时间等于递归排序大元素子集中的N-1各项所需要的时间加上进行分组的N个单位的开销。最终得出:

T(N)=T(1)+2+3+…+N=N(N+1)/2=O(N2)

(3)支点的选择:

错误方式:比较常见的不明智的选择就是把第一个元素作为支点。但如果输入是已经预先排过序的,或者是倒序的,该支点给出的分组就很糟糕,因为它是一个末端的元素;而且这种情况会在迭代中继续出现,会以O(N2)的时间复杂度而告终,所以选择第一个元素作为支点不是好的策略。

中位选择:把中间元素,即待排序序列中间位置的元素,作为支点是合理的选择。当输入已经排过序时,这种选择在每次递归调用中都会给出理想的支点。

中值划分:在上诉选择中使用中间值作为支点可以消除非随机输入时出现的退化情况。但这是一种消极的选择,就是说仅仅是试图避免一个坏的支点而并没有去尝试选择一个更好的支点。中值划分是一种选择比平均情况更好的支点的尝试。在中值划分中,一种比较简单而有效的策略是选择待排序列的第一个、中间一个以及最好一个记录这3个值的中值作为支点。同样道理,也可以从待排序列中等距离地选取5各值,并将这5各值的中值作为支点。

图1 快速排序的基本过程

4.各种排序算法比较

不同的排序算法有不同的时间和空间复杂性以及不同的排序稳定性。所谓排序算法的稳定性是指该算法不改变等值记录之间的先后顺序。表4.1列出了几种比较典型的算法在时间、空间复杂性以及算法稳定性方面的性能。

由上表可知:

(1)就平均时间性能而言,快速排序、堆排序和归并排序都有最好的时间性能。

相对而言,快速排序速度最快。但快速排序在最坏情况下的时间性能达到

了O(n2),不如堆排序和归并排序快。

(2)就空间性能来看,直接插入排序、冒泡排序、简单选择排序、堆排序要求的辅助空间比较小。其中直接插入排序、冒泡排序、简单选择排序比较简单,容易实现,但时间性能较差。

二、算法说明

本实验的目的是设计并实现一种快速排序(Quicksort)的优化版本,并且比较在下列组合情况下算法的性能表现:

(1)cutoff值从0~20。Cutoff值的作用是只有当数组的长度小于等于这个值

时,才使用另一种简单排序方法对其排序,否则使用Quicksort算法排序。

(2)选定支点的方法分别是“第一个元素”,“三个元素的中值”,“五个元素

的中值”。

对上述的测试分别要采用顺序、逆序、随机三种类型的输入文件。

输入文件中测试数组的大小可以从1000个数到10000个数不等。程序从input.txt文件中读取输入,输出到out .txt文件。例如:

input.txt 内容如下。

5/*数字的个数/

5 4 3 2 1 /*数字用空格分开*/

/*两组测试数据中间空一行*/

10

4 6 8 7

5 1 3 9 2 0

相应的output.txt内容如下。

Case number:1

Number of elements:5

1 2 3 4 5

Case number:2

Number of elements:10

0 1 2 3 4 5 6 7 8 9

程序的重点在于对每种组合情况下算法性能的比较。不同的运行时间要

用图表表示出来,在图表中要区分由于文件大小的不同而产生的差别。三、测试结果

测试目的:分析支点(median的值)和数组小于多少时使用简单排序算法(cutoff的值)值选择和待排序数据的情况(顺序,逆序,随机)对快速排序算法效率的影响。

这里提供一个测试输出的结果(输出结果太长,只提供部分):

测试方法:

对本程序的测试不仅是测试程序是否正常运行,是否排列正确,更重要的是记录不同情况下的运行时间(running time)来比较在不同的支点算法中的运行效率。

根据题目要求生成3种类型的测试用例。

(1)顺序(Sorted)的测试用例;

(2)逆序(Reverse-Ordered)的测试用例;

(3)随机(Random)的测试用例

使用的分别为1000、2000、3000、4000、5000、6000、7000、8000、9000、10000等10种类型。

使用测试文件对采用三种不同支点选择方法的算法进行测试,每次测试可

以使用不同的cutoff值(从0~20,选择其中的0、5、10、15、20,共五个)。

综上所述,一般来说较为全面的做法是做出3(3种支点算法)×5(5种cutoff 值)×3(3种顺序的测试用例)×10(10种Size),共450组测试,分别记录它们的运行时间,再使用图表加以形象化的显示。

表2给出一个实际测试例子的一部分数据。

四、分析与探讨

1、测试结果分析

表2用图的形式表现,如图2所示。

MedianOf3 Pivot Result(In-order Sorted)

Input size

图2在顺序测试用例情况下的running time

由图2可知,在顺序情况下,当cutoff为20时,平均用时最少。

MedianOf3 Pivot Results(Reverse-ordered)

Input size

由图3可知,在逆序情况下,当cutoff为20时,平均用时最少。

MedianOf3 Pivot Results(Random)

Input size

图4 在随机测试用例情况下的running time

由图4可知,在随机测试用例情况下,当cutoff为15时,平均用时最少。

设计分析:

程序主要由6部分组成,分别是:

(1)程序入口main函数, 从input.txt文件中读取数据,放入Array数组中,在执行QuickSort函数之前用clock函数获取系统时95F44 stop变量中。使用stop-start获得QuickSort函数的执行时间。将运行时间和排序后的数组一起输入到output.txt文件中。关闭input.txt文件,关闭output.txt文件。

(2)Quicksort,快速排序算法的实现部分,Quicksort函数包括五个参数分别是数组的地址Array,待排序的第一个元素在数组中的下标,待排序的最后一个元素在数组中的下标,cutoff(小于cutoff时使用另一种简单的方法进行排序),支点median。Quicksort函数分为以下几个步骤1.确定数组的大小是否为0或1,若为0或1则直接退出函数排序为完成。2.判断支点median取值是否为1,3或5,否则返回错误。3.判断cutoff取值是否恰当。4.用median函数获得支点。5.在分别设定指针指low和high向数组第一个和最后一个元素。5通过low++和--high的方式让low 和high向中间移动直到Array[low]大于median或Array[high]小于median。6判断low 是否小于high,若不小于,则交换Array[low]与Array[high]的值,否则跳出循环排序完成。7将原数组分成两部分后分别用Quicksort函数处理两个数组。Quicksort 函数排序是一个将数组以median为分界分成一个元素都小于median的数组和一个元素都大于median的数组。再将这两个数组用Quicksort函数处理的递归调用过程。

(3)MedianOf3,选择三个值的中值作为支点;

(4)MedianOf5,选择五个值的中值作为支点;

(5)简单的交换两个元素的值;

(6)InsertionSort,在数组长度小于cutoff值时使用插入排序来代替快速排序。描述main和Quicksort两个函数的基本算法的运算过程下面

Main函数:

打开input.txt和output.txt文件;

读入数的个数n;

从文件中顺序读入n个数,并放到数组中;

应用Quicksort堆该数组排序;

将排序后的数输出到文件output.txt中;

读入下一组数的个数,继续上述过程;

关闭文件。

Quicksort函数:

参数:待排数组,待排段的起点位置,待排段的终点位置,cutoff值,支点选择

方法

If数组时空的

Exit

If待排数段的元素个数大于等于cutoff值,且元素个数大于等于支点选择方法所要求的元素个数根据支点选择方法选择一个元素作为支点

设置low为起点值、high为终点至

While low<=high{

While low位置的值小于支点值

Low++

While high位置的值大于支点值

High—

If low

交换low、high两个元素

}

将low位置的元素与支点元素交换

Quicksort递归调用左半段

Quicksort递归调用右半段

Else

应用直接插入排序法对数组元素排序

五、小结

通过这次课程设计,进一步加深了我对各种排序算法的认识,特别是快速排序算法。每种排序算法都有其不足,我们在编写程序时要用其长处。不足之处我们可以使用其他算法进行替换。从而在时间上获得更好的效益。虽然这次课程设计已经有现成的代码但是我从代码中学到了一些东西,比如对文件的读写操作。以前我很少会将程序的输出结果以文本的格式存放起来。我觉得我在数据结构这门课上还需要花很多的功夫把各种算法都编写成程序运行一下,课本知识与实践操作相差甚远!

本次课程设计的另一个收获,我觉得这个收获比知识上的收获更大。我在上课的过程中受到了老师的鞭策,我意识到我现在学的知识还远远不够。为了更高的目标,我还要继续努力!

附录源代码

#include

#include

#include

#include

#define SIZE 10000 /* 数组最大的容量*/

int MedianOf3(int a[],int low, int high);

int MedianOf5(int a[],int low, int high);

void Swap(int *a,int *b);

void QuickSort(int a[], int left, int right, int cutoff, int median);

void InsertionSort(int a[],int low, int high);

int main()

{

int i,group=0,numbOFelements, elements, Amount;

int Array[10000];

int cutoff = 0, median = 3;

clock_t start, stop;

FILE *InputPTR,*OutputPTR; /* input和output文件指针*/

InputPTR=fopen("input.txt","r+");

OutputPTR=fopen("output.txt","w+");

if(InputPTR==NULL) /* 检查input文件是否存在*/

{

printf("Can not open file!");

exit(0);

}

printf("Please Input the value of cutoff(0 ~ 20):");

scanf("%d",&cutoff);

printf("Please Input the value of median(1 or 3 or 5):");

scanf("%d",&median);

Amount = fscanf(InputPTR,"%d",&numbOFelements); /* 读取每次迭代的元素的个数*/

while (Amount!=EOF) /* 当读到的不是文件的末尾*/

{

group++;

fprintf(OutputPTR,"Case number: %d\nNumber of elements: %d\n", group, numbOFelements); /*输出的格式*/

for(i=0;i

fscanf(InputPTR,"%d",&Array[i]); /*将输入读入到数组中*/

fgetc(InputPTR);

}

fgetc(InputPTR);

QuickSort(Array,0,numbOFelements-1,cutoff,median); /*给数组排序*/

for(i=0;i

{

fprintf(OutputPTR,"%d ",Array[i]); /*打印排序后的数组*/ }

Amount = fscanf(InputPTR,"%d",&numbOFelements);

fprintf(OutputPTR,"\n\n");

}

fclose(InputPTR);

fclose(OutputPTR);

return 0;

}

/******支点(pivot)选择三个值的中值的算法******/

int MedianOf3(int a[],int low, int high)

{

int mid=(low+high)/2; /* 确定中间位置*/

if(a[low]>a[mid]){

Swap(&a[low],&a[mid]);

}if(a[low]>a[high]){

Swap(&a[low],&a[high]);

}if(a[mid]>a[high]){

Swap(&a[mid],&a[high]);

}

Swap(&a[mid],&a[high]); /* 交换排序后的中间元素和最后元素的值*/

return a[high];

}

/******支点(pivot)选择五个值的中值的算法******/

int MedianOf5(int a[],int low, int high)

{

int i,temp,j,largest;

int Step;

Step=(high-low)/4; /* 设定步长为四分之一,这样便能选出五个元素*/ for (j=0; j<4; ++j)

{

largest = high-j*Step; /*每次迭代选择不同的值作为最大值*/

for (i=j+1; i<5; ++i)

{ /* 比较每次选中的值,用来找到最大值*/ if (a[high-i*Step]>a[largest])

{

largest = high-i*Step; /* 设定新的最大值*/

}

}

Swap(&a[high-j*Step],&a[largest]); /* 将每次找到的最大值放在每次对应的位置*/

}

Swap(&a[high-Step-Step],&a[high]); /* 将选定的支点放到最后面*/

Swap(&a[high-3*Step],&a[low]);

return a[high];

}

/******交换两个元素******/

void Swap(int *a,int *b)

{

int temp=*a;

*a=*b;

*b=temp;

}

/******插入排序******/

void InsertionSort(int a[], int min, int max)

{

int j,i,temp;

for (i=min;i<=max;i++)

{

temp=a[i];

for(j=i;j>min && a[j-1]>temp;j--)

a[j]=a[j-1];

a[j]=temp;

}

}

/******快速排序******/

void QuickSort(int Array[], int min, int max, int cutoff, int median) {

/* median=1时使用第一个值作为支点

median=3时使用三个值的中值作为支点

median=5时使用五个值的中值作为支点

*/

int low,high,Pivot;

if ((max-min)==0)

return; /* 如果数组中没有元素*/

if( (median != 1) && (median!=3) && (median!=5) ){

/* median只可以为1、3、5 */

printf("Invalid median value!\n");

exit(0);

}

if (min+cutoff <= max && (max-min+1)>=median)

{ /* 检查cutoff值是否合适*/ if (median == 1){

Swap(&Array[min],&Array[max]);

Pivot=Array[max];

}

else if (median == 3){

/* 调用函数MedianOf3 */

Pivot = MedianOf3(Array, min,max);

} else if (median == 5){

/*调用函数MedianOf5 */

Pivot = MedianOf5(Array,min,max);

}

low = min; high = max;

for( ; ; )

{

while(Array[low] < Pivot)

{ /*跳过比支点小的值*/

low++;

}

while(Array[--high] > Pivot)

{ /* 跳过比支点大的值*/

}

if(low

{ /* 交换两个值*/

Swap(&Array[low],&Array[high]);

}

else{

/* 如果指针重叠了,则跳出循环*/

break;

}

}

Swap(&Array[low],&Array[max]);

QuickSort(Array, min, low-1,cutoff, median); /* 分成两部分递归调用快速排序*/

QuickSort(Array, low+1, max,cutoff,median);

}

else{

InsertionSort(Array, min, max); /* 对剩余的数组进行插入排序*/

}

}

排序操作实验报告

数据结构与算法设计 实验报告 (2016 — 2017 学年第1 学期) 实验名称: 年级: 专业: 班级: 学号: 姓名: 指导教师: 成都信息工程大学通信工程学院

一、实验目的 验证各种简单的排序算法。在调试中体会排序过程。 二、实验要求 (1)从键盘读入一组无序数据,按输入顺序先创建一个线性表。 (2)用带菜单的主函数任意选择一种排序算法将该表进行递增排序,并显示出每一趟排序过程。 三、实验步骤 1、创建工程(附带截图说明) 2、根据算法编写程序(参见第六部分源代码) 3、编译 4、调试 四、实验结果图 图1-直接输入排序

图2-冒泡排序 图3-直接选择排序 五、心得体会 与哈希表的操作实验相比,本次实验遇到的问题较大。由于此次实验中设计了三种排序方法导致我在设计算法时混淆了一些概念,设计思路特别混乱。虽然在理清思路后成功解决了直接输入和直接选择两种算法,但冒泡

排序的算法仍未设计成功。虽然在老师和同学的帮助下完成了冒泡排序的算法,但还需要多练习这方面的习题,平时也应多思考这方面的问题。而且,在直接输入和直接选择的算法设计上也有较为复杂的地方,对照书本做了精简纠正。 本次实验让我发现自己在算法设计上存在一些思虑不周的地方,思考问题过于片面,逻辑思维能力太过单薄,还需要继续练习。 六、源代码 要求:粘贴个人代码,以便检查。 #include #define MAXSIZE 100 typedef int KeyType; typedef int DataType; typedef struct{ KeyType key; DataType data; }SortItem,SqList[MAXSIZE]; /*******直接插入顺序表*******/ void InsertSort(SqList L,int n) { int i,j,x; SortItem p; for(i=1;i

《数据结构》实验报告——排序.docx

《数据结构》实验报告排序实验题目: 输入十个数,从插入排序,快速排序,选择排序三类算法中各选一种编程实现。 实验所使用的数据结构内容及编程思路: 1. 插入排序:直接插入排序的基本操作是,将一个记录到已排好序的有序表中,从而得到一个新的,记录增一得有序表。 一般情况下,第i 趟直接插入排序的操作为:在含有i-1 个记录的有序子序列r[1..i-1 ]中插入一个记录r[i ]后,变成含有i 个记录的有序子序列r[1..i ];并且,和顺序查找类似,为了在查找插入位置的过程中避免数组下标出界,在r [0]处设置哨兵。在自i-1 起往前搜索的过程中,可以同时后移记录。整个排序过程为进行n-1 趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第2 个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。 2. 快速排序:基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序的序列为{L.r[s] ,L.r[s+1],…L.r[t]}, 首先任意选取一个记录 (通常可选第一个记录L.r[s])作为枢轴(或支点)(PiVOt ),然后按下述原则重新排列其余记录:将所有关键字较它小的记录都安置在它的位置之前,将所有关键字较大的记录都安置在它的位置之后。由此可以该“枢轴”记录最后所罗的位置i 作为界线,将序列{L.r[s] ,… ,L.r[t]} 分割成两个子序列{L.r[i+1],L.[i+2], …,L.r[t]}。这个过程称为一趟快速排序,或一次划分。 一趟快速排序的具体做法是:附设两个指针lOw 和high ,他们的初值分别为lOw 和high ,设枢轴记录的关键字为PiVOtkey ,则首先从high 所指位置起向前搜索找到第一个关键字小于PiVOtkey 的记录和枢轴记录互相交换,然后从lOw 所指位置起向后搜索,找到第一个关键字大于PiVOtkey 的记录和枢轴记录互相 交换,重复这两不直至low=high 为止。 具体实现上述算法是,每交换一对记录需进行3 次记录移动(赋值)的操作。而实际上,

(完整word版)查找、排序的应用 实验报告

实验七查找、排序的应用 一、实验目的 1、本实验可以使学生更进一步巩固各种查找和排序的基本知识。 2、学会比较各种排序与查找算法的优劣。 3、学会针对所给问题选用最适合的算法。 4、掌握利用常用的排序与选择算法的思想来解决一般问题的方法和技巧。 二、实验内容 [问题描述] 对学生的基本信息进行管理。 [基本要求] 设计一个学生信息管理系统,学生对象至少要包含:学号、姓名、性别、成绩1、成绩2、总成绩等信息。要求实现以下功能:1.总成绩要求自动计算; 2.查询:分别给定学生学号、姓名、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现); 3.排序:分别按学生的学号、成绩1、成绩2、总成绩进行排序(要求至少用两种排序算法实现)。 [测试数据] 由学生依据软件工程的测试技术自己确定。 三、实验前的准备工作 1、掌握哈希表的定义,哈希函数的构造方法。 2、掌握一些常用的查找方法。 1、掌握几种常用的排序方法。 2、掌握直接排序方法。

四、实验报告要求 1、实验报告要按照实验报告格式规范书写。 2、实验上要写出多批测试数据的运行结果。 3、结合运行结果,对程序进行分析。 五、算法设计 a、折半查找 设表长为n,low、high和mid分别指向待查元素所在区间的下界、上界和中点,key为给定值。初始时,令low=1,high=n,mid=(low+high)/2,让key与mid指向的记录比较, 若key==r[mid].key,查找成功 若keyr[mid].key,则low=mid+1 重复上述操作,直至low>high时,查找失败 b、顺序查找 从表的一端开始逐个进行记录的关键字和给定值的比较。在这里从表尾开始并把下标为0的作为哨兵。 void chaxun(SqList &ST) //查询信息 { cout<<"\n************************"<=1;j--) if(ST.r[j].xuehao

实验报告-排序与查找

电子科技大学实验报告 课程名称:数据结构与算法 学生姓名: 学号: 点名序号: 指导教师: 实验地点:基础实验大楼 实验时间: 5月20日 2014-2015-2学期 信息与软件工程学院

实验报告(二) 学生姓名学号:指导教师: 实验地点:基础实验大楼实验时间:5月20日 一、实验室名称:软件实验室 二、实验项目名称:数据结构与算法—排序与查找 三、实验学时:4 四、实验原理: 快速排序的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是: 1)设置两个变量I、J,排序开始的时候I:=1,J:=N 2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1]; 3)从J开始向前搜索,即(J:=J-1),找到第一个小于X的值,两者交换; 4)从I开始向后搜索,即(I:=I+1),找到第一个大于X的值,两者交换; 5)重复第3、4步,直到I=J。 二分法查找(折半查找)的基本思想: (1)确定该区间的中点位置:mid=(low+high)/2 min代表区间中间的结点的位置,low代表区间最左结点位置,high代表区间最右结点位置(2)将待查a值与结点mid的关键字(下面用R[mid].key)比较,若相等,则查找成功,否则确定新的查找区间: A)如果R[mid].key>a,则由表的有序性可知,R[mid].key右侧的值都大于a,所以等于a的关键字如果存在,必然在R[mid].key左边的表中,这时high=mid-1; B)如果R[mid].key

查找与排序实验报告

实验四:查找与排序 【实验目的】 1.掌握顺序查找算法的实现。 2.掌握折半查找算法的实现。 【实验内容】 1.编写顺序查找程序,对以下数据查找37所在的位置。 5,13,19,21,37,56,64,75,80,88,92 2.编写折半查找程序,对以下数据查找37所在的位置。 5,13,19,21,37,56,64,75,80,88,92 【实验步骤】 1.打开VC++。 2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK->finish。 至此工程建立完毕。 3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File。给文件起好名字,选好路径,点OK。至此一个源文件就被添加到了你刚创建的工程之中。 4.写好代码 5.编译->链接->调试 #include "stdio.h" #include "malloc.h" #define OVERFLOW -1 #define OK 1 #define MAXNUM 100 typedef int Elemtype; typedef int Status; typedef struct {

Elemtype *elem; int length; }SSTable; Status InitList(SSTable &ST ) { int i,n; ST.elem = (Elemtype*) malloc (MAXNUM*sizeof (Elemtype)); if (!ST.elem) return(OVERFLOW); printf("输入元素个数和各元素的值:"); scanf("%d\n",&n); for(i=1;i<=n;i++) { scanf("%d",&ST.elem[i]); } ST.length = n; return OK; } int Seq_Search(SSTable ST,Elemtype key) { int i; ST.elem[0]=key; for(i=ST.length;ST.elem[i]!=key;--i); return i; } int BinarySearch(SSTable ST,Elemtype key) { int low,high,mid; low=1; high=ST.length;

排序问题实验报告

2010级数据结构实验报告 实验名称:排序 姓名:袁彬 班级: 2009211120 班内序号: 09 学号: 09210552 日期: 2010 年12 月19 日 1.实验要求 试验目的: 通过选择试验内容中的两个题目之一,学习、实现、对比各种排序的算法,掌握各种排序算法的优缺点,以及各种算法使用的情况。 试验内容: 题目一: 使用简单数组实现下面各种排序算法,并进行比较。 排序算法如下: ①插入排序; ②希尔排序 ③冒泡排序; ④快速排序; ⑤简单选择排序; ⑥堆排序 ⑦归并排序 ⑧基数排序 ⑨其他。 具体要求如下: ①测试数据分为三类:正序,逆序,随机数据。 ②对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换记为三次移动)。 ③对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微妙。 ④对②和③的结果进行分析,验证上述各种算法的时间复杂度。 ⑤编写main()函数测试各种排序算法的正确性。 题目二: 使用链表实现下面各种排序算法,并进行比较。 排序算法如下: ①插入排序; ②冒泡排序; ③快速排序;

④简单选择排序; ⑤其他。 具体要求如下: ①测试数据分为三类:正序,逆序,随机数据。 ②对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换记为三次移动)。 ③对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微妙(选作) ④对②和③的结果进行分析,验证上述各种算法的时间复杂度。 ⑤编写main()函数测试各种排序算法的正确性。 2. 程序分析 2.1 存储结构 程序中每一个算法均是用一个类来表示的,类中有自己的构造函数、排序函数。 程序的储存结构采用数组。数组的第一个位置不存储数据。数据从第二个位置开始。数组中的相对位置为数组的下标。 2.2 关键算法分析 ㈠、关键算法: 1、插入排序函数:Insert s ort(int n) ①、从2开始做循环,依次和前面的数进行比较:for(int i=2;i<=n;i++) ②、如果后面的比前面的小,则进行前移:if(number[i]=1;d=d/2) ②、在自己的间隔中进行简单插入排序,进行循环:for(int i=d+1;i<=n;i++) ③、如果后面的数据比前面的小,进行前移:if(number[i]0;j=j-d) ⑥、大的数据后移:number[j+d]=number[j]; ⑦、哨兵归位:number[j+d]=number[0]; 3、冒泡排序函数:Bubble s ort(int n) ①、设置有序无序的边界点:int pos=n; ②、当边界点不为空进行循环:while(pos!=0) ③、边界点传递给bound:int bound=pos; ④、从开始到边界点进行循环:for(int i=1;inumber[i+1]) ⑥、交换:number[0]=number[i];number[i]=number[i+1];number[i+1]=number[0]; ⑦、从小设置边界点:pos=i; 4、一趟快速排序函数:partion(int first,int end) ①、传递设置整个数据的起点和终点:int i=first;int j=end; ②、设置中轴:number[0]=number[i]; ③、当end大于first进行循环:while(i

算法排序问题实验报告

《排序问题求解》实验报告 一、算法的基本思想 1、直接插入排序算法思想 直接插入排序的基本思想是将一个记录插入到已排好序的序列中,从而得到一个新的,记录数增1 的有序序列。 直接插入排序算法的伪代码称为InsertionSort,它的参数是一个数组A[1..n],包含了n 个待排序的数。用伪代码表示直接插入排序算法如下: InsertionSort (A) for i←2 to n do key←A[i] //key 表示待插入数 //Insert A[i] into the sorted sequence A[1..i-1] j←i-1 while j>0 and A[j]>key do A[j+1]←A[j] j←j-1 A[j+1]←key 2、快速排序算法思想 快速排序算法的基本思想是,通过一趟排序将待排序序列分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序序列为数组A[1..n],首先选取第一个数A[0],作为枢轴(pivot),然后按照下述原则重新排列其余数:将所有比A[0]大的数都排在它的位置之前,将所有比A[0] 小的数都排在它的位置之后,由此以A[0]最后所在的位置i 作为分界线,将数组A[1..n]分成两个子数组A[1..i-1]和A[i+1..n]。这个过程称作一趟快速排序。通过递归调用快速排序,对子数组A[1..i-1]和A[i+1..n]排序。 一趟快速排序算法的伪代码称为Partition,它的参数是一个数组A[1..n]和两个指针low、high,设枢轴为pivotkey,则首先从high 所指位置起向前搜索,找到第一个小于pivotkey 的数,并将其移到低端,然后从low 所指位置起向后搜索,找到第一个大于pivotkey 的数,并将其移到高端,重复这两步直至low=high。最后,将枢轴移到正确的位置上。用伪代码表示一趟快速排序算法如下: Partition ( A, low, high) A[0]←A[low] //用数组的第一个记录做枢轴记录 privotkey←A[low] //枢轴记录关键字 while low=privotkey do high←high-1 A[low]←A[high] //将比枢轴记录小的记录移到低端 while low

各种排序实验报告

【一】需求分析 课程题目是排序算法的实现,课程设计一共要设计八种排序算法。这八种算法共包括:堆排序,归并排序,希尔排序,冒泡排序,快速排序,基数排序,折半插入排序,直接插入排序。 为了运行时的方便,将八种排序方法进行编号,其中1为堆排序,2为归并排序,3为希尔排序,4为冒泡排序,5为快速排序,6为基数排序,7为折半插入排序8为直接插入排序。 【二】概要设计 1.堆排序 ⑴算法思想:堆排序只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。将序列所存储的元素A[N]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的元素均不大于(或不小于)其左右孩子(若存在)结点的元素。算法的平均时间复杂度为O(N log N)。 ⑵程序实现及核心代码的注释: for(j=2*i+1; j<=m; j=j*2+1) { if(j=su[j]) break; su[i]=su[j]; i=j; } su[i]=temp; } void dpx() //堆排序 { int i,temp; cout<<"排序之前的数组为:"<=0; i--) { head(i,N); } for(i=N-1; i>0; i--) {

temp=su[i]; su[i]=su[0]; su[0]=temp; head(0,i-1); } cout<<"排序之后的数组为:"<

顺序表的查找、插入与删除实验报告

《数据结构》实验报告一 学院:班级: 学号:姓名: 日期:程序名 一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个整数,产生顺序表,并输入结点值。 2.从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找 不到,则显示“找不到”。 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出顺序表所有结点值,观察输出结果。 4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 二、源程序及注释: #include #include /*顺序表的定义:*/ #include #define ListSize 100 /*表空间大小可根据实际需要而定,这里假设为100*/ typedef int DataType; /*DataType可以是任何相应的数据类型如int, float或char*/ typedef struct { DataType data[ListSize]; /*向量data用于存放表结点*/ int length; /*当前的表长度*/ }SeqList; void main() { SeqList L; int i,x; int n=10; /*欲建立的顺序表长度*/ L.length=0; void CreateList(SeqList *L,int n); void PrintList(SeqList L,int n); int LocateList(SeqList L,DataType x); void InsertList(SeqList *L,DataType x,int i); void DeleteList(SeqList *L,int i);

河南工业大学实验报告——查找和排序(排序)——张伟龙

河南工业大学实验报告 课程名称数据结构实验项目实验三查找和排序(二)——排序院系信息学院计科系专业班级计科1203 姓名张伟龙学号 201216010313 指导老师范艳峰日期 2013.6.5 批改日期成绩 一实验目的 掌握希尔排序、快速排序、堆排序的算法实现。 二实验内容及要求 实验内容:1.实现希尔排序。 2.实现快速排序。 3. 实现堆排序。 (三选一) 实验要求:1. 根据所选题目,用C语言编写程序源代码。 2. 源程序必须编译调试成功,独立完成。 三实验过程及运行结果 选择第三题: Source Code: #include #include using namespace std; void HeapAdjust(int *a,int i,int size) //调整堆 { int lchild=2*i; //i的左孩子节点序号

int rchild=2*i+1; //i的右孩子节点序号 int max=i; //临时变量 if(i<=size/2) //如果i是叶节点就不用进行调整 { if(lchild<=size&&a[lchild]>a[max]) { max=lchild; } if(rchild<=size&&a[rchild]>a[max]) { max=rchild; } if(max!=i) { swap(a[i],a[max]); HeapAdjust(a,max,size); //避免调整之后以max为父节点的子树不是堆 } } } void BuildHeap(int *a,int size) //建立堆 { int i; for(i=size/2;i>=1;i--) //非叶节点最大序号值为size/2 { HeapAdjust(a,i,size); } }

数据结构内排序实验报告

一、实验目的 1、了解内排序都是在内存中进行的。 2、为了提高数据的查找速度,需要对数据进行排序。 3、掌握内排序的方法。 二、实验内容 1、设计一个程序e xp10—1.cpp实现直接插入排序算法,并输出{9,8,7,6,5,4,3,2,1,0}的排序 过程。 (1)源程序如下所示: //文件名:exp10-1.cpp #include #define MAXE 20 //线性表中最多元素个数 typedef int KeyType; typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; void InsertSort(RecType R[],int n) //对R[0..n-1]按递增有序进行直接插入排序 { int i,j,k; RecType temp; for (i=1;i=0 && temp.key

大数据结构实验四题目一排序实验报告材料

数据结构实验报告 实验名称:实验四——排序 学生姓名:XX 班级: 班内序号: 学号: 日期: 1.实验要求 实验目的: 通过选择实验内容中的两个题目之一,学习、实现、对比、各种排序的算法,掌握各种排序算法的优劣,以及各种算法使用的情况。 题目1: 使用简单数组实现下面各种排序算法,并进行比较。 排序算法如下: 1、插入排序; 2、希尔排序; 3、冒泡排序; 4、快速排序; 5、简单选择排序; 6、堆排序; 7、归并排序; 8、基数排序(选作); 9、其他。 具体要求如下: 1、测试数据分成三类:正序、逆序、随机数据。 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关 键字交换记为3次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微妙。 4、对2和3的结果进行分析,验证上述各种算法的时间复杂度。 5、编写main()函数测试各种排序算法的正确性。 2. 程序分析 2.1 存储结构

存储结构:数组 2.2 关键算法分析 一、关键算法: 1、插入排序 a、取排序的第二个数据与前一个比较 b、若比前一个小,则赋值给哨兵 c、从后向前比较,将其插入在比其小的元素后 d、循环排序 2、希尔排序 a、将数组分成两份 b、将第一份数组的元素与哨兵比较 c、若其大与哨兵,其值赋给哨兵 d、哨兵与第二份数组元素比较,将较大的值赋给第二份数组 e、循环进行数组拆分 3、对数据进行编码 a、取数组元素与下一个元素比较 b、若比下一个元素大,则与其交换 c、后移,重复 d、改变总元素值,并重复上述代码 4、快速排序 a、选取标准值 b、比较高低指针指向元素,若指针保持前后顺序,且后指针元素大于标准值,后 指针前移,重新比较 c、否则后面元素赋给前面元素 d、若后指针元素小于标准值,前指针后移,重新比较 e、否则前面元素赋给后面元素 5、简单选择排序 a、从数组中选择出最小元素 b、若不为当前元素,则交换 c、后移将当前元素设为下一个元素 6、堆排序 a、生成小顶堆 b、将堆的根节点移至数组的最后 c、去掉已做过根节点的元素继续生成小顶堆

内部排序比较 (实验报告+源程序)C++

实验报告3 实验名称:数据结构与软件设计实习 题目:内部排序算法比较 专业:生物信息学班级:01 姓名:学号:实验日期:2010.07.24 一、实验目的: 比较冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序; 二、实验要求: 待排序长度不小于100,数据可有随机函数产生,用五组不同输入数据做比较,比较的指标为关键字参加比较的次数和关键字移动的次数; 对结果做简单的分析,包括各组数据得出结果的解释; 设计程序用顺序存储。 三、实验内容 对各种内部排序算法的时间复杂度有一个比较直观的感受,包括关键字比较次数和关键字移动次数。 将排序算法进行合编在一起,可考虑用顺序执行各种排序算法来执行,最后输出所有结果。 四、实验编程结果或过程: 1. 数据定义 typedef struct { KeyType key; }RedType; typedef struct { RedType r[MAXSIZE+1]; int length; }SqList; 2. 函数如下,代码详见文件“排序比较.cpp”int Create_Sq(SqList &L) void Bubble_sort(SqList &L)//冒泡排序void InsertSort(SqList &L)//插入排序 void SelectSort(SqList &L) //简单选择排序int Partition(SqList &L,int low,int high) void QSort(SqList &L,int low,int high)//递归形式的快速排序算法 void QuickSort(SqList &L) void ShellInsert(SqList &L,int dk)//希尔排序 void ShellSort(SqList &L,int dlta[ ]) 3. 运行测试结果,运行结果无误,如下图语速个数为20

《数据结构》实验报告查找

实验四——查找 一、实验目的 1.掌握顺序表的查找方法,尤其是折半查找方法; 2.掌握二叉排序树的查找算法。 二、实验内容 1.建立一个顺序表,用顺序查找的方法对其实施查找; 2.建立一个有序表,用折半查找的方法对其实施查找; 3.建立一个二叉排序树,根据给定值对其实施查找; 4.对同一组数据,试用三种方法查找某一相同数据,并尝试进行性能分析。 三、实验预习内容 实验一包括的函数有:typedef struct ,创建函数void create(seqlist & L),输出函数void print(seqlist L),顺序查找int find(seqlist L,int number),折半查找int halffind(seqlist L,int number) 主函数main(). 实验二包括的函数有:结构体typedef struct,插入函数void insert(bnode * & T,bnode * S),void insert1(bnode * & T),创建函数void create(bnode * & T),查找函数bnode * search(bnode * T,int number),主函数main(). 四、上机实验 实验一: 1.实验源程序。 #include<> #define N 80 typedef struct { int number; umber; for(i=1;[i].number!=0;) { cin>>[i].name>>[i].sex>>[i].age; ++; cout<>[++i].number; } } umber<<"\t"<<[i].name<<"\t"<<[i].sex<<"\t"<<[i].age<

查找排序实验报告

《编程实训》 实验报告书 专业:计算机科学与技术 班级:151班 学号: 姓名: 指导教师: 日期:2016年6月30日

目录 一、需求分析 (3) 1.任务要求 (3) 2.软件功能分析 (3) 3.数据准备 (3) 二、概要设计 (3) 1.功能模块图 (4) 2.模块间调用关系 (4) 3.主程序模块 (5) 4.抽象数据类型描述 (5) 三、详细设计 (6) 1.存储结构定义 (6) 2.各功能模块的详细设计 (7) 四、实现和调试 (7) 1.主要的算法 (7) 2.主要问题及解决 (8) 3.测试执行及结果 (8) 五、改进 (9) 六、附录 (9) 1.查找源程序 (9) 2.排序源程序 (9)

目录 1 需求分析 1.1 任务要求 对于从键盘随机输入的一个序列的数据,存入计算机内,给出各种查找算法的实现; 以及各种排序算法的实现。 1.2 软件功能分析 任意输入n个正整数,该程序可以实现各类查找及排序的功能并将结果输出。 1.3 数据准备 任意输入了5个正整数如下: 12 23 45 56 78 2 概要设计(如果2,3合并可以省略2.4) 2.1 功能模块图(注:含功能说明) 2.2 模块间调用关系 2.3 主程序模块 2.4 抽象数据类型描述 存储结构:数据结构在计算机中的表示(也称映像)叫做物理结构。又称为存储结构。数据类型(data type)是一个“值”的集合和定义在此集合上的一组操作的总称。 3 详细设计 3.1 存储结构定义 查找: typedef int ElemType ; //顺序存储结构 typedef struct { ElemType *elem; //数据元素存储空间基址,建表时按实际长度分配,号单元留空 int length; //表的长度

数据结构(C语言版)实验报告-(内部排序算法比较)

数据结构与算法》实验报告 一、需求分析 问题描述:在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。 基本要求: (l )对以下 6 种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。 (2 )待排序表的表长不小于100000 ;其中的数据要用伪随机数程序产生;至少要用 5 组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为 3 次移动)。 ( 3 )最后要对结果作简单分析,包括对各组数据得出结果波动大小的解释。数据测试:二.概要设计 1. 程序所需的抽象数据类型的定义: typedef int BOOL; typedef struct StudentData { } Data; typedef struct LinkList { Data Record[MAXSIZE]; int num; // 存放关键字 int Length; // 数组长度// 用数组存放所有的随机数 // 说明BOOL 是int 的别名 } LinkList int RandArray[MAXSIZE]; // 定义长度为MAXSIZE 的随机数组 void RandomNum() // 随机生成函数

void InitLinkList(LinkList* L) // 初始化链表 // 比较所有排序 2 . 各程序模块之间的层次(调用)关系: BOOL LT(int i, int j,int* CmpNum) // 比较 i 和 j 的大小 void Display(LinkList* L) // 显示输出函数 void ShellSort(LinkList* L, int dlta[], int t,int* CmpNum, int* ChgNum) void QuickSort (LinkList* L, // 快速排序 void HeapSort (LinkList* L, // 堆排序 void BubbleSort(LinkList* L, // 冒泡排序 void SelSort(LinkList* L, // 选择排序 int* CmpNum, int* ChgNum) int* CmpNum, int* ChgNum) int* CmpNum, int* ChgNum) * CmpNum, int* ChgNum) void Compare(LinkList* L,int* CmpNum, int* ChgNum) // 希尔排序

数据结构排序实验报告

《数据结构》课程设计报告 实验五排序 一、需求分析: 本演示程序用C++6.0编写,完成各种排序的实现,对输入的一组数字实现不同的排序方法,对其由小到大顺序输出。 (1)分别对直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序算法进行编写。 (2)、对存储的函数即输入的数字进行遍历。 (3)、初始化函数对输入的数字进行保存。 (4)、主函数实现使用者操作界面的编写,对输入、选择、保存、输出的各种实现。这当中还包括了各个函数的调用的实现。 (5)、程序所能达到的功能:完成对输入的数字的生成,并通过对各排序的选择实现

数字从小到大的输出。 二、程序主要功能以及基本要求: (1)、设计一个菜单,格式如下: 1、直接插入排序 2、希尔排序 3、冒泡排序 4、快速排序 5、选择排序 6、堆排序 7、退出 (2)、选择不同的菜单但进行相应的排序,并给出排序的关键字序列。 三、系统框架图: 本程序包含了9个函数,它们分别是: (1)、直接插入排序的算法函数InsertSort()。 (2)、希尔排序的算法函数ShellSort()。 (4)、快速排序的算法函数Partition()。 (5)、选择排序算法函数SelectSort()。 (6)、堆排序算法函数HeapAdjust()。 (7)、对存储数字的遍历函数Visit()。 (8)、初始化函数InitSqList()。 (9)、主函数main()。 四、详细设计 实现各个算法的主要内容,下面是各个函数的主要信息: (1)各个排序函数的算法:

一、直接插入排序 void InsertSort(SqList &L) { int i,j; for( i=2; i<=L.length;i++) { if(L.r[i].key < L.r[i-1].key) { L.r[0] = L.r[i]; L.r[i] = L.r[i-1]; for( j=i-2; (L.r[0].key < L.r[j].key); j--) L.r[j+1] = L.r[j]; L.r[j+1] = L.r[0]; } } } 二、希尔排序 void ShellSort(SqList &L) { int i, j; int dk = 1;//增量 while(dk <=L.length/3) dk = 3*dk+1;//增大增量 while(dk>0) { dk /= 3;//减小增量 for (i = dk; i <=L.length; i++) { L.r[0].key = L.r[i].key; j = i;

排序算法实验报告

实验课程:算法分析与设计 实验名称:几种排序算法的平均性能比较(验证型实验) 实验目标: (1)几种排序算法在平均情况下哪一个更快。 (2)加深对时间复杂度概念的理解。 实验任务: (1)实现几种排序算法(selectionsort, insertionsort,bottomupsort,quicksort, 堆排序)。对于快速分类,SPLIT中的划分元素采用三者A(low),A(high),A((low+high)/2)中其值居中者。(2)随机产生20组数据(比如n=5000i,1≤i≤20)。数据均属于范围(0,105)内的整数。对于同一组数据,运行以上几种排序算法,并记录各自的运行时间(以毫秒为单位)。(3)根据实验数据及其结果来比较这几种分类算法的平均时间和比较次数,并得出结论。 实验设备及环境: PC;C/C++等编程语言。 实验主要步骤: (1)明确实验目标和具体任务; (2)理解实验所涉及的几个分类算法; (3)编写程序实现上述分类算法; (4)设计实验数据并运行程序、记录运行的结果; (5)根据实验数据及其结果得出结论; (6)实验后的心得体会。 一:问题分析(包括问题描述、建模、算法的基本思想及程序实现的技巧等):1:随机生成n个0到100000的随机数用来排序的算法如下. for(int n=1000;n<20000;n+=1000) { int a[]=new int[n]; for(int i=0;i

河南工业大学实验报告_实验三 查找和排序(一)——查找

xxx大学实验报告 课程名称数据结构实验项目实验三查找和排序(一)——查找 院系信息学院计类系专业班级计类1501 姓名学号 指导老师日期 批改日期成绩 一实验目的 1.掌握哈希函数——除留余数法的应用; 2. 掌握哈希表的建立; 3. 掌握冲突的解决方法; 4. 掌握哈希查找算法的实现。 二实验内容及要求 实验内容:已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79),哈希 函数定义为:H(key)=key MOD 13, 哈希表长为m=16。实现该哈希表的散列,并 计算平均查找长度(设每个记录的查找概率相等)。 实验要求:1. 哈希表定义为定长的数组结构;2. 使用线性探测再散列或链 地址法解决冲突;3. 散列完成后在屏幕上输出数组内容或链表;4. 输出等概率 查找下的平均查找长度;5. 完成散列后,输入关键字完成查找操作,要分别测 试查找成功与不成功两种情况。 注意:不同解决冲突的方法会使得平均查找长度不同,可尝试使用不同解决 冲突的办法,比较平均查找长度。(根据完成情况自选,但至少能使用一种方法 解决冲突) 三实验过程及运行结果 #include #include #include #define hashsize 16

#define q 13 int sign=2; typedef struct Hash { int date; //值域 int sign; //标记 }HashNode; void compare(HashNode H[],int p,int i,int key[]) //线性冲突处理{ p++; if(H[p].sign!=0) { sign++; compare(H,p,i,key); } else { H[p].date=key[i]; H[p].sign=sign; sign=2; } } void Hashlist(HashNode H[],int key[]) { int p; for(int i=0;i<12;i++) { p=key[i]%q; if(H[p].sign==0) { H[p].date=key[i]; H[p].sign=1; } else compare(H,p,i,key); } } int judge(HashNode H[],int num,int n) //查找冲突处理 {

相关文档
最新文档