“oesort(sqlist l,int n)”:该函数进行奇偶排序将无序的数据排成有序的。
五. 核心程序算法:
void shellsort(sqlist& l,int d
//采用希尔排序,本程序中的使暂存单元,非哨兵。
d=while(d>0)
for(i=d+1;i<=
if(<
for(j=i-d;j>0&&<
d=d/2;}
基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。
先在各组内进行直接插人排序;然后,取第二个增量d2void quicksort(sqlist& l,int low,int high)
//快速排序。
if(low
基本思想。设当前待排序的无序区为r[low..high],利用分治法可将快速排序的基本思想描述为:
①分解:在r[low..high]中任选一个记录作为基准(pivot),以此基准将当前无序区划分为左、右两个较小的子区间r[low..
pivotpos-1]和r[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字右边的子区间中所有记录的关键字均大于等于而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。注意:
划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(注pivot=r[pivotpos])r[low..pivotpos-1].
keys≤r[pivotpos].key≤r[pivotpos+1..high].
keys其中low≤pivotpos≤high。②求解:通过递归调用快速排序对左、右子区间r[low..
pivotpos-1]和r[pivotpos+1..high]快速排序。③组合:
因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。
void heapadjust(sqlist &l,int s,int m)
// 筛选法调整堆,使其成为大顶堆
rc=for(j=2*s;j<=m;j*=2)
if(jj++;
if(rc>
s=j;}void heapsort(sqlist &l)
//建堆的过程。
for(i=>0;i--)
heapadjust(l,i,for(i=>1;i--)
t=heapadjust(l,1,i-1);
基本思想:堆排序利用了大根堆堆顶记录的关键字最大这一特征,使得在当前无序区中选取最大关键字的记录变得简单。先将初始文件r[1..
n]建成一个大根堆,此堆为初始的无序区。再将关键字最大的记录r[1](即堆顶)和无序区的最后一个记录r[n]交换,由此得到新的无序区r[1..n-1]和有序区r[n],且满足r[1..
n-1].keys≤r[n].key。
由于交换后新的根r[1]可能违反堆性质,故应将当前无序区r[1..n-1]调整为堆。然后再次将r[1..
n-1]中关键字最大的记录r[1]和该区间的最后一个记录r[n-1]交换,由此得到新的无序区r[1..n-2]和有序区r[n-1..n],且仍满足关系r[1..
n-2].keys≤r[n-1..n].
keys,同样要将r[1..n-2]调整为堆。
直到无序区只有一个元素为止。
void oesort(sqlist& l,int n)
//奇偶交换排序。
change=1;标志变量,若其为零,即两次更替的交换中都没有交换数据,即排序结束。
while(change)
change=0;
for(i=1;iif(>
t=change=1;
for(i=2;iif(>
t=change=1;
算法过程:第一趟对序列中的所有奇数项i扫描,第二趟对序列中的所有偶数项i扫描。若ri] >r[i+1],则交换它们。
第三趟有对所有的奇数项,第四趟对所有的偶数项,……
如此反复,直到整个序列全部排好序为止。
五.源程序:
#include ""
#include ""
#include ""
#define maxsize 5
typedef struct
void quicksort(sqlist l,int low,int high)
int i,j;
if(low{i=low;j=high;
dowhile(i
-j;if(i{
while(i++i;
if(iwhile(i!=j);
quicksort(l,low,i-1);
quicksort(l,i+1,high);
void heapadjust(sqlist l,int s,int m)
int rc,j;
rc=for(j=2*s;j<=m;j*=2)
if(jj++;
if(rc>
break;
s=j;void heapsort(sqlist l)
int i,t;
for(i=>0;i--)
heapadjust(l,i,for(i=>1;i--)
t=heapadjust(l,1,i-1);
void oesort(sqlist l,int n)
int t,i,change;
change=1;
while(change)
change=0;
for(i=1;iif(>
t=change=1;
for(i=2;iif(>
t=change=1;
main()
int i,j,low,high,a[maxsize+1];
char ch;
sqlist l;
clrscr();
*)malloc(maxsize*sizeof(int));
if(!printf("overflow");
printf("please input five elements:");
数据结构课程设计报告
东莞理工学院城市学院。题目 二叉排序树 专业 计算机科学与技术 本 年级 2010级计算机科学与技术专业 1 班。个人姓名 何振江。指导教师 张娟老师 时间 2010至2011第二学期第18周 地点 实验楼615机房 东莞理工学院城市学院计算机与信息科学系制。2011年 6月。实习报告的内容。一 问...
数据结构课程设计报告
设计一个校园导游程序,为来访的客人提供信息查询服务。1 设计学校的校园平面图。选取若干个有代表性的景点抽象成一个无向带权图 无向网 以图中顶点表示校内各景点,边上的权值表示两景点之间的距离。2 存放景点代号 名称 简介等信息供用户查询。3 为来访客人提供图中任意景点相关信息的查询。4 为来访客人提供...
数据结构课程设计报告
河北科技大学。课程设计报告。学生姓名学号。专业班级。课程名称数据结构。学年学期 2 012 2 013学年第 2 学期指导教师 黄春茹。2 0 13年 6 月。课程设计成绩评定表。一 数据结构课程设计目标。二 问题描述。三 需求分析。四 概要设计。五 详细设计。六 软件说明书 给出软件如何使用,使用...