当前位置:文档之家› 大数据结构课程设计排序算法演示系统58165

大数据结构课程设计排序算法演示系统58165

大数据结构课程设计排序算法演示系统58165
大数据结构课程设计排序算法演示系统58165

各专业全套优秀毕业设计图纸

计算机学院

数据结构课程设计

题目:数据结构排序算法演示系统

班级:

姓名:

学号:

同组人姓名:

起迄日期:

课程设计地点:

指导教师:

评阅意见:

成绩评定:

评阅人:日期:

完成日期:2014年12月

目录

一、课程设计的目的 (1)

二、设计内容和要求 (1)

三、数据采取的结构 (1)

四、功能模块详细设计 (1)

4.1 详细设计思想 (2)

4.1.1 冒泡排序 (5)

4.1.2 快速排序 (7)

4.1.3 直接插入排序 (9)

4.1.4 希尔排序 (10)

4.1.5 直接选择排序 (12)

4.1.6 堆排序 (14)

4.1.7归并排序 (17)

五、总结或心得体会 (19)

六、参考文献 (20)

七、附录 (20)

一. 设计目的

随着计算机技术的发展,各种排序算法不断的被提出。排序算法在计算机科

学中有非常重要的意义,且应用很广泛。在以后的发展中排序对我们的学习和生

活的影响会逐渐增大,很有必要学习排序知识。此次课程设计一方面使自己掌握

排序的知识,另一方面锻炼一下团队合作开发系统的能力。

二. 设计内容和要求

功能要求:

(1)界面友好,易与操作。可采用菜单或其它人机对话方式进行选择。

(2)实现各种内部排序。包括直接插入排序,冒泡排序,直接选择排序,希尔排序,快速排序,堆排序,归并排序。

(3)待排序的元素的关键字为整数或(字符)。可用随机数据和用户输入数据作测试比较。比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换以3次计)。

(1)演示程序以人机对话的形式进行。每次测试完毕显示各种比较指标值的列表,以便比较各种排序的优劣。

三. 本设计所采用的数据结构

typedef struct

{

int key;

}RecType;

4.1 详细设计思想

主函数:

#include

#include

#include

#define L 8 //排序元素个数

#define FALSE 0

#define TRUE 1

typedef struct

{

int key;

}RecType;

RecType R[L];

int num;

int sum;

int sun; //定义排序趟数的全局变量

//系统主界面

//主函数

int main()

{

RecType S[100];

int i,k;

char ch1,ch2,q;

printf("\n\t\t***********排序算法演示系统************\n\n\t\t 请输入%d个待排序的数据:\n",L);

for(i=1;i<=L;i++)

{

printf("\t\t请输入第%dth数据:",i);

scanf("%d",&S[i].key);

getchar();

}

ch1='y';

while(ch1=='y')

{

printf("\n\t\t 菜单\n");

printf("\n\t\t***********************************************\n") ;

printf("\n\t\t * 1--------更新排序数据* 2--------直接插入排序 \n");

printf("\n\t\t * 3--------希尔排序* 4--------冒泡排序 \n");

printf("\n\t\t * 5--------快速排序* 6--------直接选择排

序 \n");

printf("\n\t\t * 7--------堆排序 * 8--------归并排

序 \n");

printf("\n\t\t **********0--------退出************ \n");

printf("\n\t\t********************************************\n");

printf("\n\t\t请选择:");

scanf("%c",&ch2);

getchar();

for(i=1;i<=L;i++)

{

R[i].key=S[i].key;

}

switch(ch2)

{

case '1':

printf("\n\t\t请输入%d个待排序数据\n\t\t",L);

for(i=1;i<=L;i++)

{

scanf("%d",&S[i].key);

getchar();

printf("\t\t");

}

printf("\n\t\t数据输入完毕!");

break;

case '2':

Insertsort();

break;

case '3':

Shellsort();

break;

case '4':

Bubblesort();

break;

case '5':

printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t");

for(k=1;k<=L;k++)

{

printf("%5d",R[k].key);

}

getchar();

printf("\n");

num=0;sun=0;sum=0;

Quicksort(1,L);

printf("\n\t\t排序最终结果是:\n\t\t");

for(k=1;k<=L;k++)

{

printf("%5d",R[k].key);

}

printf("\n\t\t比较次数是:%d\n\t\t",sum);

printf("\n\t\t交换次数是:%d\n\t\t",sun);

break;

case '6':

Selectsort();

break;

case '7':

Heap();

break;

case '8':

Mergesort();

break;

case '0':

ch1='n';

break;

default:

system("cls");//清屏

printf("\n\t\t对不起,您输入有误,请重新输入!\n");

break;

}

if(ch2!='0')

{

if(ch2=='2'||ch2=='3'||ch2=='4'||ch2=='5'||ch2=='6'||ch2=='7'||ch 2=='8')

{

printf("\n\n\t\t排序完毕!");

printf("\n\t\t按回车键继续!");

q=getchar();

if(q!='\n')

{

getchar();

ch1='n';

}

}

}

}

return 1;

}

图一主界面

4.1.1 冒泡排序

核心思想

依次比较相邻的两个数,将小数放在前面,大数放在后面,第一轮比较后,最大的数便被放到了最后;第二轮操作前n-1个数据(假设有n个数据),依然是依次比较相邻的两个数,将小数放在前面,大数放在后面,倒数第二个数便是第二大的数;同理第i轮操作前n-i+1的数据(假设i取值是从1开始的),则n-i+i位置上的数据为第i大的数据。一共有n-1轮,第i轮比较中共比较n-i 次比较。

核心代码

void Bubblesort()

{

int i,j,k,x=0,y=0,m=0;

int exchange=TRUE;//标志位exchange初始化为TRUE 1

printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t");

for(k=1;k<=L;k++)

{

printf("%5d",R[k].key);

}

getchar();

printf("\n");

for(i=1;i

exchange=FALSE;

for(j=1;j<=L+1-i;j++) //内层相邻记录的交换与比较

{ m++;//比较次数++

if(R[j].key

{

R[0].key=R[j].key;

R[j].key=R[j-1].key;

R[j-1].key=R[0].key;

exchange=TRUE;

y++;//移动次数++

}

}

m--;//比较次数

if(exchange) //输出语句

{

printf("\t\t第%d趟冒泡排序的结果为:\n\t\t",i);

for(k=1;k<=L;k++)

{ printf("%5d",R[k].key);

}

getchar();

printf("\n");

}

}

printf("\n\t\t比较次数是:\t\t");

printf("%d",m);

printf("\n\t\t移动次数是:\t\t");

printf("%d",y);

printf("\n\t\t排序最终结果是:\n\t\t");

for(i=1;i<=L;i++)

{ printf("%5d",R[i].key);

}

}

图二直接插入排序

4.1.2 快速排序

核心思想

首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序。通常分割点的数据是随机选取的。这样无论你的数据是否已被排列过,你所分割成的两个字列表的大小是差不多的。而只要两个子列表的大小差不多

核心代码

//递归算法实现

void Quicksort(int low,int high)

{

int i=low,j=high,k;

R[0].key=R[low].key;

while(i

{

while(i

{j--;

sum++;

}

if(i

{ R[i].key=R[j].key;//交换

i++;

sun++;

}

while(i

{i++;

sum++;

}

if(i

{

R[j].key=R[i].key;//交换

j--;

sun++;

}

}

R[i].key=R[0].key;

num++;

//输出语句包括排序的结果及次数

printf("\t\t第%d趟快速排序的结果为:\n\t\t",num);

for(k=1;k<=L;k++)

{ printf("%5d",R[k].key);

}

getchar();

printf("\n");

if(low

if(j+1

图三快速排序

4.1.3 直接插入排序

核心思想

经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止

核心代码

void Insertsort()

{

int i,j,k,m=0,x=0; //初始化比较次数变量m,移动次数变量x

printf("\n\t\t原始数据为:(按回车键开始排序)\n\t\t");

for(k=1;k<=L;k++)

{

printf("%5d",R[k].key);

}

getchar();

printf("\n");

//主要运行部分

for(i=2;i<=L;i++)

{

if(R[i].key

{

R[0]=R[i];

j=i-1;

while(R[0].key

{

R[j+1]=R[j];

j--;

}

R[j+1]=R[0];

x++;

}

m++;

//输出语句包括排序的结果及次数

printf("\t\t第%d趟直接插入排序的结果为:\n\t\t",m);

for(k=1;k<=L;k++)

{ printf("%5d",R[k].key);

}

getchar();

printf("\n");

}

printf("\n");

printf("\n\t\t比较次数是:\t\t");

printf("%d",m);

printf("\n\t\t移动次数是:\t\t");

printf("%d",x);

printf("\n\t\t排序最终结果是:\n\t\t");

for(i=1;i<=L;i++)

{ printf("%5d",R[i].key);

}

}

图四直接插入排序

4.1.4 希尔排序

核心思想

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进

行直接插入排序;然后,取第二个增量d2

核心代码

void Shellsort()

{

int i,j,gap,x,k,y=0,m=0; //初始化比较次数变量m,移动次数变量y

printf("\n\t\t原始数据为:(按回车键开始排序)\n\t\t");

for(k=1;k<=L;k++)

{

printf("%5d",R[k].key);

}

getchar();

printf("\n");

//函数主要部分

gap=L/2;

while(gap>0)

{

for(i=gap+1;i<=L;i++)

{

j=i-gap;

while(j>0)

{

if(R[j].key>R[j+gap].key)

{

x=R[j].key;//交换语句

R[j].key=R[j+gap].key;

R[j+gap].key=x;

j=j-gap;

y++;//移动次数++

}

else

{

j=0;

}

}

}

gap=gap/2;

m++;//比较次数++

//输出语句包括排序的结果及次数

printf("\t\t第%d趟希尔排序的结果为:\n\t\t",m);

for(k=1;k<=L;k++)

{

printf("%5d",R[k].key);

}

getchar();

printf("\n");

}

printf("\n\t\t比较次数是:\t\t");

printf("%d",m);

printf("\n\t\t移动次数是:\t\t");

printf("%d",y);

printf("\n\t\t排序最终结果是:\n\t\t");

for(i=1;i<=L;i++)

{

printf("%5d",R[i].key);

}

printf("\n");

}

图五希尔排序

4.1.5 直接选择排序

核心思想

第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从

R{1}~R[n-1]中选取最小值,与R[2]交换,....,第i次从R[i-1]~R[n-1]

中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列.

核心代码

void Selectsort()

{

int i,j,k,h,x=0,y=0;

printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t");

for(k=1;k<=L;k++)

{

printf("%5d",R[k].key);

}

getchar();

printf("\n");

for(i=1;i

{

h=i;

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

{x++; //比较次数

if(R[j].key

{

h=j; //确定最小值

}

}

if(h!=i)

{

R[0].key=R[i].key;

R[i].key=R[h].key;

R[h].key=R[0].key;

y++; //移动次数

}

printf("\t\t第%d趟选择排序的结果为:\n\t\t",i);

for(k=1;k<=L;k++)

printf("%5d",R[k].key);

getchar();

printf("\n");

}

//输出语句包括排序的结果及次数

printf("\n\t\t比较次数:%d",x);

printf("\n\t\t移动次数:%d",y);

printf("\n\t\t排序最终结果是:\n\t\t");

for(i=1;i<=L;i++)

printf("%5d",R[i].key);

printf("\n");

}

图六选择排序

4.1.6 堆排序

核心思想

堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。将原始记录序列建成一个堆,成为初始堆,并输出堆顶元素;调整剩余的记录序列,使之成为一个新堆,再输出堆顶元素;如此反复进行,当堆中只有一个元素时,整个序列的排序结束,输出的序列便是原始序列的非递减有序序列。在堆排序的过程中,主要负责两方面的工作:一是如何将原始记录序列构造成一个堆,即建立初始堆;二是输出堆顶元素后,如何将剩余记录整理成一个新堆。

核心代码

void CreateHeap(int root,int index,int *x,int *y)

{

int j,temp,finish;

j=2*root; //j指向左孩子

temp=R[root].key;

finish=0;

while(j<=index&&finish==0)

{

if(j

{

if(R[j].key

{

j++;

}

} //指向较大的孩子

if(temp>=R[j].key)

{

finish=1;

}

else

{

R[j/2].key=R[j].key;

(*y)++;

j=j*2;

}

*x = *x+2;

}

R[j/2].key=temp;

(*y)++;

}

//堆排序

void Heapsort()

{

int i,j,temp,k,x=0,y=0;

for(i=(L/2);i>=1;i--) //建立初始堆

{

CreateHeap(i,L,&x,&y);

}

x=0;

y=0;

for(i=L-1,k=1;i>=1;i--,k++) //将堆中根节点和最后一个节点交换{

temp=R[i+1].key;

R[i+1].key=R[1].key;

R[1].key=temp;

CreateHeap(1,i,&x,&y);

printf("\t\t第%d趟堆排序的结果为:\n\t\t",k);

for(j=1;j<=L;j++)

{

printf("%5d",R[j].key);

}

getchar();

printf("\n");

}

printf("\n\t\t比较次数是:%d\t\t",x);

printf("\n\t\t移动次数是:%d\t\t",y);

}

void Heap()

{

int i;

printf("\n\t\t原始数据为(按回车键开始排序):\n\t\t");

for(i=1;i<=L;i++)

{

printf("%5d",R[i].key);

}

getchar();

printf("\n");

Heapsort();

printf("\n\t\t排序最终结果是:\n\t\t");

for(i=1;i<=L;i++)

{

printf("%5d",R[i].key);

}

printf("\n");

}

void Merge(int low,int mm,int high,int *x,int *y)//两个有序序列的合并

{

int i=low,j=mm+1,p=0;

RecType *R1; //i对第一个开始到结尾,j从第二个开始到结尾

R1=new RecType[high-low+1];

if(!R1)

{

printf("内存不足!");

}

while(i<=mm&&j<=high)//两序列从起始位置开始将小的元素放入到R1中

{

R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++];

(*x)++;

(*y)++;

}

while(i<=mm)//第二段结束,剩余放入R1中

{

R1[p++]=R[i++];

(*y)++;

}

while(j<=high)//第二段剩余,剩余放入R1中

{

R1[p++]=R[j++];

(*y)++;

}

for(p=0,i=low;i<=high;p++,i++)//剩余元素放入R1中,赋予R

{

R[i]=R1[p];

(*y)++;

}

}

图七堆排序

4.1.7 归并排序

核心思想

将有n个记录的原始序列看作n个有序子序列,每个子序列的长度为1,然后从第一个子序列开始,把相邻的子序列两两合并,得到[n/2]个长度为2或1的子序列(当子序列个数为奇数时,最后一组合并得到的序列长度为1),把这一过程称为一次归并排序,对第一次归并排序后的[n/2]个子序列采用上述方法继续顺序成对归并,如此重复,当最后得到的长度为n的一个子序列时,该子序列便是原始序列归并排序后的有序序列。

核心代码

数据结构课程设计

1.一元稀疏多项式计算器 [问题描述] 设计一个一元稀疏多项式简单计算器。 [基本要求] 输入并建立多项式; 输出多项式,输出形式为整数序列:n, c1, e1, c2, e2,……, cn, en ,其中n是多项式的项数,ci, ei分别是第i项的系数和指数,序列按指数降序排序; 多项式a和b相加,建立多项式a+b; 多项式a和b相减,建立多项式a-b; [测试数据] (2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9-x+12x-3) (1+x+x2+x3+x4+x5)+(-x3-x4)=(x5+x2+x+1) (x+x3)+(-x-x3)=0 (x+x2+x3)+0=(x3+x2+x) [实现提示] 用带头结点的单链表存储多项式,多项式的项数存放在头结点中。 2.背包问题的求解 [问题描述] 假设有一个能装入总体积为T的背包和n件体积分别为w1, w2, …,wn的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+…+wn=T,要求找出所有满足上述条件的解。例如:当T=10,各件物品的体积为{1,8,4,3,5,2}时,可找到下列4组解:(1,4,3,2)、(1,4,5)、(8,2)、(3,5,2) [实现提示] 可利用回溯法的设计思想来解决背包问题。首先,将物品排成一列,然后顺序选取物品转入背包,假设已选取了前i件物品之后背包还没有装满,则继续选取第i+1件物品,若该件物品“太大”不能装入,则弃之而继续选取下一件,直至背包装满为止。但如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入背包的那件物品“不合适”,应将它取出“弃之一边”,继续再从“它之后”的物品中选取,如此重复,直至求得满足条件的解,或者无解。 由于回溯求解的规则是“后进先出”因此自然要用到栈。 3.完全二叉树判断 用一个二叉链表存储的二叉树,判断其是否是完全二叉树。 4.最小生成树求解(1人) 任意创建一个图,利用克鲁斯卡尔算法,求出该图的最小生成树。 5.最小生成树求解(1人) 任意创建一个图,利用普里姆算法,求出该图的最小生成树。 6.树状显示二叉树 编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。输出的二叉树是垂直打印的,同层的节点在同一行上。 [问题描述] 假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=26,假设节点的输出位置用 (层号,须打印的空格数)来界定。 第0层:根在(0,32)处输出;

数据结构课程设计题目2010

一、数据结构课程设计要求 1.学生必须仔细阅读《数据结构》课程设计方案,认真主动完成课设的要求。有问题及时主动通过各种方式与教师联系沟通。 2.学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时向教师汇报。 3.课程设计按照教学要求需要两周时间完成,两周中每天(按每周5天)至少要上2小时的上机来调试C 或C++语言设计的程序,总共至少要上机调试程序20小时。属教师安排上机时间学生不得缺席。 二、数据结构课程设计题目 1. 运动会分数统计(限1 人完成) 任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20) 功能要求: 1) 可以输入各个项目的前三名或前五名的成绩; 2) 能统计各学校总分, 3) 可以按学校编号或名称、学校总分、男女团体总分排序输出; 4) 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 5) 数据存入文件并能随时查询 6) 规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称 输出形式:有中文提示,各学校分数为整形 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构; 测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明; 2. 飞机订票系统(限1 人完成) 任务:通过此系统可以实现如下功能: 录入: 可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)

冒泡排序的算法及其程序实现

冒泡排序的算法及其程序实现 浙江省慈溪中学施迪央 教学分析: 本节课是浙江教育出版社出版的普通高中课程标准实验教科书《算法与程序设计》第二第3节以及第五章第3节的部分教学内容。 一组不长的数据(如5个),从小到大排序,对学生来说是一件容易的事情,但他们并不知道计算机是怎么实现排序的,同时他们也没见识过计算机对大量数据(如1000个)的排序。学习排序有助于学生对计算机工作原理的认识。冒泡排序对学生来说初次接触,但前面的枚举算法和解析算法的部分内容对学习排序有一定的帮助,如数组变量的定义及使用方法、双重循环的使用方法及特点以及如何通过键盘输入一批数据(即text1_keypress()事件)在前面都已涉及,冒泡排序的学习又可以巩固前面的知识。 关于冒泡排序的算法及程序实现我安排了3个课时,本案例是在教室内完成的2节随堂课,第3课时安排学生上机实践:对键盘输入的一批数据进行冒泡排序。 教学目标: 1、知识与技能: 了解排序及冒泡排序的概念及特点 掌握冒泡排序算法的原理 初步掌握冒泡排序的程序实现 2、过程与方法: 理解冒泡排序的分析过程,并初步掌握用冒泡排序算法来设计解决简单的排序问题 3、情感态度与价值观: 通过冒泡排序算法的分析过程,培养学生思维的严谨性以及用科学方法解决问题的能力使学生深入理解计算机的工作原理,激发了学生学习程序兴趣。 教学重点: 冒泡排序算法的原理 教学难点: 分析冒泡排序的实现过程 教学策略: 讲授法与探究法。教师讲授、学生听讲,教师提问、学生动脑,层层深入,步步为营,一切水到渠成。 教学准备: 编写好手动输入一批的数据的冒泡排序的程序 编写好计算机自动生成数据的冒泡排序的程序 课堂中使用的教学课件 教学过程: 一、问题引入 问题一:什么是排序? 所谓排序,把杂乱无章的一列数据变为有序的数据,比如7,3,4,8,1这五个数据从小到大排序,结果是1,3,4,7,8,我们很容易排出来。那么电脑是怎么进行排序的呢?问题二:一批数据在VB中如何存储的?比如如何存储六位裁判为一位运动员评出的分数? 用数组变量来存储一批类型、作用相同的数据,如分别用d(1),d(2),d(3),d(4),d(5),d(6)来存储六位裁判给出的分数。 问题三:如果运动员的最后得分是从这6个分数中去掉最高分与最低分后的平均分,你认为

不改变数据位置的排序算法及动态演示

不改变数据位置的排序算法及动态演示 宁宁1,张霞2 (1.潍坊教育学院信息工程系,山东青州 262500; 2.潍坊教育学院数学系,山东青州 262500) 摘要:实际应用中经常遇到要求不改变原始数据的顺序而按关键字的大小对数据进行排序的情况,原有的一些经典排序算法不能直接用于解决该类问题。经过对选择排序算法进行研究,给出了基于选择思想的不改变数据位置而对数据进行排序的算法,并利用C#语言编程对该算法的实现过程进行了动态演示。 关键词:排序; 关键字; 选择; 定时器 Sorting Algorithm Without Changing the Data Position & Dynamic Demonstration 1.FU Ning 2.ZHANG Dong-xia (1.The Information Engineering Department of Weifang College of Education,Qingzhou Shandong 262500)(2.The Information Engineering Department of Weifang College of Education,Qingzhou Shandong 262500)Abstract:In practical application, the situation, in which it requires a listing of the data in the order of the size of the keywords without changing the order of the original data, is an often-met case. The original classic sorting algorithm cannot be used directed to solve this kind of problem. This paper, by researching into the selective sorting algorithm, puts forward an algorithm on the basis of sorting the data without changing the positions of the data. It also gives a dynamic demonstration of the realization procedure of this algorithm by applying the C language programming. Keywords:sorting ; key word ; select ; timer 1.问题的提出 排序是计算机程序设计中一项基本的操作,在实际应用中,有很多情况下需要对数据按照某种方式进行排序后才能达到某种要求,因此,学习和研究各种排序方法是计算机工作者的重要课题之一。 我们已经熟知的、比较成熟的排序算法有很多,比如冒泡排序、选择排序、插入排序、快速排序等,利用这些排序算法都能够使一组数据序列按照某个关键字排成需要的顺序。但这些经典的排序算法在对数据序列排序时,都要改变数据的原始顺序,也就是说,在一般情况下,排序问题的输入是n个数a1,a2,a3,……,a n的一个序列,按照某个关键字对初始序列进行重新排序后产生初始输入序列的一个重新排列:a11,a21,a31,……,a n1,使得a11< a21< a31<……< a n1。经过排序后的结果序列一般和初始的输入序列是不一样的。而在实际应用中,我们可能只需要对数据按照某个关键字进行排序,记下该关键字对应的记

数据结构课程设计(内部排序算法比较_C语言)

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

第二章系统分析 界面的设计如图所示: |******************************| |-------欢迎使用---------| |-----(1)随机取数-------| |-----(2)自行输入-------| |-----(0)退出使用-------| |******************************| 请选择操作方式: 如上图所示该系统的功能有: (1):选择1 时系统由客户输入要进行测试的元素个数由电脑随机选取数字进行各种排序结果得到准确的比较和移动次数并 打印出结果。 (2)选择2 时系统由客户自己输入要进行测试的元素进行各种排序结果得到准确的比较和移动次数并打印出结果。 (3)选择0 打印“谢谢使用!!”退出系统的使用!! 第三章系统设计 (I)友好的人机界面设计:(如图3.1所示) |******************************| |-------欢迎使用---------| |-----(1)随机取数-------| |-----(2)自行输入-------| |-----(0)退出使用-------|

数据结构课程设计

福建工程学院课程设计 课程:数据结构课程设计 题目: 1.综合应用 2.折半查找 3.快速排序 专业:软件工程 班级:1101 座号:3110305129 姓名:潘聪 2012 年 6 月26 日

设计题目1:综合应用 一、问题描述 有N名学生,每名学生含有如下信息:学号、姓名、某四门课的成绩,并计算其总分,用一结构数组表示之。然后实现以下功能: (1)将这些数据存放至文件stuf.dat中; (2)将文件中的数据读出至结构数组中,并显示之; (3)输出总分最高分和最低分的名字; (4)输出总分在340分,单科成绩不低于80分的名单; (5)求出各科平均分数; (6)按总分排名; (7)输出补考名单。 二、解决问题的算法思想描述 (1)子函数:首先确定需要的子函数,总共7个,对应的功能分别是题目要求的七项(2)主函数:主函数中,要设计出易于使用的人机界面,就必须要用到switch 。 (3)文件的存放读取,必须要用到文件的函数,fopen,fread,fclose等。 (4)把每个学生的信息定义在一个结构数组中,利用结构数组更加方便。 (5)各科成绩排名用冒泡排序即可。 (6)输出总分,补考名单,各科的平均分都比较简单。 三、设计 1. 数据结构的设计和说明 //定义结构体 typedef struct { int num; //学号 char name[10]; //姓名 int score1; //语文 int score2; //数学 int score3; //物理 int score4; //化学 }student; student stu[MAX]; //结构数组 2.模块结构图及各模块的功能:

数据结构课程设计报告---几种排序算法的演示(附源代码)

? & 数据结构课程设计报告 —几种排序算法的演示( ; 时间:2010-1-14 … 一需求分析

运行环境 Microsoft Visual Studio 2005 程序所实现的功能 对直接插入排序、折半插入排序、冒泡排序、简单选择排序、快速排序、堆排序、归并排序算法的演示,并且输出每一趟的排序情况。 程序的输入(包含输入的数据格式和说明) % <1>排序种类三输入 <2>排序数的个数的输入 <3>所需排序的所有数的输入 程序的输出(程序输出的形式) <1>主菜单的输出 <2>每一趟排序的输出,即排序过程的输出 " 二设计说明 算法设计思想 <1>交换排序(冒泡排序、快速排序) 交换排序的基本思想是:对排序表中的数据元素按关键字进行两两比较,如果发生逆序(即排列顺序与排序后的次序正好相反),则两者交换位置,直到所有数据元素都排好序为止。 <2>插入排序(直接插入排序、折半插入排序) % 插入排序的基本思想是:每一次设法把一个数据元素插入到已经排序的部分序列的合适位置,使得插入后的序列仍然是有序的。开始时建立一个初始的有序序列,它只包含一个数据元素。然后,从这个初始序列出发不断插入数据元素,直到最后一个数据元素插到有序序列后,整个排序工作就完成了。 <3>选择排序(简单选择排序、堆排序) 选择排序的基本思想是:第一趟在有n个数据元素的排序表中选出关键字最小的数据元素,然后在剩下的n-1个数据元素中再选出关键字最小(整个数据表中次小)的数据元素,依次重复,每一趟(例如第i趟,i=1,…,n-1)总是在当前剩下的n-i+1个待排序数据元素中选出关键字最小的数据元素,作为有序数据元素序列的第i个数据元素。等到第n-1趟选择结束,待排序数据元素仅剩下一个时就不用再选了,按选出的先后次序所得到的数据元素序列即为有序序列,排序即告完成。 <4>归并排序(两路归并排序) 两路归并排序的基本思想是:假设初始排序表有n个数据元素,首先把它看成是长度为

数据结构课程设计-排序

一、问题描述 1、排序问题描述 排序是计算机程序设计的一种重要操作,他的功能是将一组任意顺序数据元素(记录),根据某一个(或几个)关键字按一定的顺序重新排列成为有序的序列。简单地说,就是将一组“无序”的记录序列调整为“有序”的记录序列的一种操作。 本次课程设计主要涉及几种常用的排序方法,分析了排序的实质,排序的应用,排序的分类,同时进行各排序方法的效率比较,包括比较次数和交换次数。我们利用java语言来实现本排序综合系统,该系统包含了:插入排序、交换排序、选择排序、归并排序。其中包括: (1)插入排序的有关算法:不带监视哨的直接插入排序的实现; (2)交换排序有关算法:冒泡排序、快速排序的实现; (3)选择排序的有关算法:直接选择排序、堆排序的实现; (4)归并排序的有关算法:2-路归并排序的实现。 2、界面设计模块问题描述 设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。界面要求简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处理。 二、问题分析 本人设计的是交换排序,它的基本思想是两两比较带排序记录的关键字,若两个记录的次序相反则交换这两个记录,直到没有反序的记录为止。应用交换排序基本思想的主要排序方法有冒泡排序和快速排序。 冒泡排序的基本思想是:将待排序的数组看作从上到下排列,把关键字值较小的记录看作“较轻的”,关键字值较大的纪录看作“较重的”,较小关键字值的记录好像水中的气泡一样,向上浮;较大关键字值的纪录如水中的石块向下沉,当所有的气泡都浮到了相应的位置,并且所有的石块都沉到了水中,排序就结束了。 冒泡排序的步骤: 1)置初值i=1; 2)在无序序列{r[0],r[1],…,r[n-i]}中,从头至尾依次比较相邻的两个记录r[j] 与r[j+1](0<=j<=n-i-1),若r[j].key>r[j+1].key,则交换位置; 3)i=i+1; 4)重复步骤2)和3),直到步骤2)中未发生记录交换或i=n-1为止; 要实现上述步骤,需要引入一个布尔变量flag,用来标记相邻记录是否发生交换。 快速排序的基本思想是:通过一趟排序将要排序的记录分割成独立的两个部分,其中一部分的所有记录的关键字值都比另外一部分的所有记录关键字值小,然后再按此方法对这两部分记录分别进行快速排序,整个排序过程可以递归进行,以此达到整个记录序列变成有序。 快速排序步骤: 1)设置两个变量i、j,初值分别为low和high,分别表示待排序序列的起始下

数据结构课程设计

<<数据结构>> 课 程 设 计 班级:111004 姓名:董丽美 学号:111004122 指导教师:史延新 完成日期:2013 _07 _10

题目一:约瑟夫环问题 【问题描述】约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n 的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m 的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出列顺序。【基本要求】利用单向循环链表存储结构模拟此过程,按照出列的顺序打印出各人的编号。 【测试数据】m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序应为:6,1,4,7,2,3,5) 一 .需求分析 1.用单循环链表存储并遍历及删除节点的方法,计算并输出约瑟夫环的问题。 2.环中总人数和节点信息由用户输入,且均为正整数。3.在窗口界面输出出列顺序的编号。 二.概要设计

1.设定链表的抽象数据类型定义: ADT List{ 数据对象:D={a(i)|a(i)∝Elemset,i=1,2,…,n,n>=0} 数据关系:R1={|a(i-1),a(i)∝D,i=2,…,n}基本操作: InitList(&L) 操作结果:构造一个空的线性表 ListInsert(&L,i,e) 初始条件:线性表L已经存在。 操作结果:在L中第i个位置之前插入新的数据元素 e,L的长度增加1。 ListDelete(&L,i,&e) 初始条件:线性表L已经存在且非空,1<=i<=ListLength(L)。操作结果:删除L的第i个数据元素,并用e返回其值,L 的长度减1 。 } 2.算法的基本思想: 根据题目要求,采用单循环线性表的基本操作来实现约瑟夫环问题。首先根据所给信息生成链表节点并插入,根据节点记录密码及其所在链表中的顺序,由给出的初始访问值进行遍历,当变量i增量等于所给的值(即关键字)时,指针所指的节点处的顺序值即为所需输出的顺序号。每输出一次顺

高中信息技术_冒泡排序算法教学设计学情分析教材分析课后反思

高一冒泡排序教学设计 基本路线:数组-排序-冒泡排序【冒泡排序原理--流程图-算法优化】-小结 一、教材分析:本节内容选自浙江教育出版社《算法与程序设计》第五章第三节。本节课主要讲解冒泡排序思想。排序算法是使用频率最高的算法之一,而冒泡排序是其中一种很典型而且相对简单的方法。它的学习同时为后面的选择排序做了铺垫。 教学目标 知识目标:掌握冒泡排序的原理;掌握冒泡排序的流程图; 能力目标:学会使用冒泡排序思想设计解决简单排序问题的算法;进一步理解程序设计的基本方法,体会程序设计在现实中的作用; 进一步学习流程框图的使用。 情感目标:增强分析问题、发现规律的能力,激发学习热情; 学情分析 通过前面的学习,学生已经了解vb算法设计的基本知识,学会 利用自然语言和流程图描述解决问题的算法,对排序中循环语句以有了一定的基础。但数组变量的使用方法尚未接触,程序设计思想比较弱,在实际生活中往往忽视运用排序算法来处理实际问题,这就要求学生通过本节课的学习,学会运用冒泡排序算法来处理实际问题,并为以后学习其它排序算法打下基础。 二、重点难点 重点:理解冒泡排序原理及它的流程图

难点:理解冒泡排序中的遍、次等概念(即对变量使用的理解)以及用流程图描述冒泡排序的过程 三、教学策略与手段 采用讲解法、演示法、分析归纳法引导学生参与思考,用逐步求精的方式降低学生的理解难度,化抽象为具体,由特殊到一般,有效地突出重点、突破难点。 四、课前准备 1.教师的教学准备:冒泡排序的课件、学案、素材 2.教学环境的设计与布置:多媒体网络教室、电子白板、多媒体教学平台等 五、教学过程 课前学习【设计意图】学生能自己学会的不讲。排序数组知识点相对简单,由学生自学完成,之前的知识点学生可能会有所遗忘,通过这个方式让学生回顾。冒泡排序算法原理比较容易也由学生自学完成。 已给出的素材,完成学案关于数组、冒泡排序和循环结构的基本模式的相关部分的内容,。 请同学们学习学习网站上的课前学习,并完成学案的相关部分的内容。 上课! 对答案。

各种排序算法演示--综合排序

课程设计(论文)任务书 学院计算机科学与技术专业2005-1 班 一、课程设计(论文)题目各种排序算法演示 二、课程设计(论文)工作自 2007年 6月 25 日起至 2007年 7月 8日止。 三、课程设计(论文) 地点: 多媒体实验室(5-302,303) 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)熟练掌握C语言的基本知识和技能; (2)掌握各种排序(直接插入,希尔,冒泡,快速排序,简单选择,堆排序)方法及适用场合,并能在解决实际问题时灵活应用; (3)从空间和时间的角度分析各种排序; (5)培养分析、解决问题的能力;提高学生的科技论文写作能力。 2.课程设计的任务及要求 1)基本要求: (1)设计一个的菜单将在实现的功能显示出来,并有选择提示; (2)分别实现直接插入,希尔,冒泡,快速排序,简单选择,堆排序算法; (3)通过多种测试数据,对各种排序算法的时间复杂度和空间复杂度进行比较并说明在实际场合的运用。 2)创新要求: 提高算法效率,降低时间复杂度和空间复杂度 3)课程设计论文编写要求 (1)要按照课程设计模板的规格书写课程设计论文 (2)论文包括目录、正文、心得体会、参考文献等 (3)课程设计论文用B5纸统一打印,装订按学校的统一要求完成 4)答辩与评分标准: (1)完成原理分析:20分; (2)完成设计过程:40分; (3)完成调试:20分; (4)回答问题:20分。

5)参考文献: (1)严蔚敏,吴伟民.数据结构. 北京:清华大学出版社,2006. (2)严蔚敏、吴伟民、米宁.数据结构题集。北京:清华大学出版社,2006. (3) 谭浩强. C程序设计(第二版)作者:清华大学出版社,2006. 6)课程设计进度安排 内容天数地点 构思及收集资料2图书馆 编程设计与调试5实验室 撰写论文3图书馆、实验室 学生签名: 年月日 课程设计(论文)评审意见 (1)完成原理分析(20分):优()、良()、中()、一般()、差();(2)设计分析(20分):优()、良()、中()、一般()、差();(3)完成调试(20分):优()、良()、中()、一般()、差();(4)翻译能力(20分):优()、良()、中()、一般()、差();(5)回答问题(20分):优()、良()、中()、一般()、差();(6)格式规范性及考勤是否降等级:是()、否() 评阅人:职称: 年月日

数据结构课程设计排序实验报告

《数据结构》课程设计报告 专业 班级 姓名 学号 指导教师 起止时间

课程设计:排序综合 一、任务描述 利用随机函数产生n个随机整数(20000以上),对这些数进行多种方法进行排序。(1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。并把排序后的结果保存在不同的文件中。 (2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。 要求:根据以上任务说明,设计程序完成功能。 二、问题分析 1、功能分析 分析设计课题的要求,要求编程实现以下功能: (1)随机生成N个整数,存放到线性表中; (2)起泡排序并计算所需时间; (3)简单选择排序并计算时间; (4)希尔排序并计算时间; (5)直接插入排序并计算所需时间; (6)时间效率比较。 2、数据对象分析 存储数据的线性表应为顺序存储。 三、数据结构设计 使用顺序表实现,有关定义如下: typedef int Status; typedef int KeyType ; //设排序码为整型量 typedef int InfoType; typedef struct { //定义被排序记录结构类型 KeyType key ; //排序码 I nfoType otherinfo; //其它数据项 } RedType ; typedef struct { RedType * r; //存储带排序记录的顺序表 //r[0]作哨兵或缓冲区 int length ; //顺序表的长度 } SqList ; //定义顺序表类型 四、功能设计 (一)主控菜单设计

数据结构课程设计

郑州工业应用技术学院 课程设计说明书 题目:手机信息数据检索 姓名:王港 院(系):信息工程学院 专业班级:16级计算机科学与技术6班 学号:1601110241 指导教师:王礼云 成绩: 时间:2018 年 1 月 2 日至2018 年 1 月12

郑州工业应用技术学院 课程设计任务书 题目手机信息数据检索 专业、班级16级计算机科学与技术6班学号1601110241姓名王港 主要内容: 开发一个手机信息数据检索,使管理员可以很好的管理回收的手机,避免平时废旧手机没有作用,不知道如何去处理旧的手机等问题。减轻废旧手机资源的浪费。本废旧手机回收系统利用单链表实现了基本信息的添加。管理员能够对各种信息进行修改,例如手机信息添加,手机信息删除,密码修改,退出系统。 基本要求: 1、巩固并加深学生对数据结构基本算法的理解; 2、认识面向过程和面向对象两种设计方法的区别; 3、进一步掌握和应用VC++6.0 集成开发环境; 4、提高运用对于数据结构的理解,增强了我解决实际问题的能力; 5、初步掌握开发小型实用软件的基本方法。 主要参考资料: [1]谭浩强. C语言基础课程[M].北京:清华大学出版社,2009. [2]刘振安. C程序设计课程设计[M].北京:机械工业出版社,2016. [3]滕国文. 数据结构课程设计[M].北京:清华大学出版社, 2010. [4]吴伟民. 数据结构[M].北京:清华大学出版社, 2017. 完成期限:2018.1.2-2018.1.12 指导教师签名: 课程负责人签名: 2018 年1 月12 日

摘要 21世纪以来,经济高速发展,人们生活发生了日新月异的变化,特别是手机普及到每个人生活的各个领域。但对于手机的回收越来越不适应现在社会的发展。计算机技术的飞速发展,也为我们带来了巨大的便利。为了适应现代人们回收旧手机方便的愿望。手机信息管理系统软件能够为我们现如今手机回收带来巨大的便利。 我国现如今已经成为手机产品的生产消费大国,伴随着通信技术的迅猛发展,手机更新换代的速度不断提高。特别是追求时尚潮流的大学生群体手机的更换频率增加更快。随着智能手机产品不断推陈出新,手机更新换代的周期也在缩短。据业内人士估计,我国存量闲置手机至少以亿计,但旧手机的回收率却不到2%,旧手机的处置成为一大问题。 中国目前废旧手机的回收现状和回收模式,造成我国手机回收效率低下,更是对垃圾回收产业带来了巨大的冲击,同时目前,我国年废旧手机产生量约上亿部,大部分闲置家中,未能有效回收利用。既浪费了资源,又威胁居民身心健康,造成环境污染。在分析我国废旧手机回收利用现状的基础上,提出了完善废旧手机回收的法律制度、增强消费者环保意识、构建绿色环保废旧手机回收利用新模式等建议。本手机信息数据检索为回收手机的人管理废旧的手机使用,使用单链表实现,对于信息的增加删除效率比较高,可以很方便的进行各种信息管理,对于数据的管理可以让我们更好的面对管理手机的繁杂工作。 关键字:信息检索;冒泡算法;单链表

动态排序算法演示软件设计

动态排序算法演示软件设计 南阳理工学院 本科生毕业设计(论文) 学院(系): 软件学院 专业: 软件工程 学生: 胡晓波 指导教师: 张枫 完成日期 2011 年 04 月 南阳理工学院本科生毕业设计(论文) 动态排序算法演示软件设计 ——动态演示的实现 Sorting algorithms dynamic demonstration of software design ——the realization of dynamic demonstration 总计 : 20 页毕业设计(论文) 表格 : 14 个 插图 : 10 幅 南阳理工学院本科毕业设计(论文) 动态排序算法演示软件设计 ——动态演示的实现 Sorting algorithms dynamic demonstration of software design ——the realization of dynamic demonstration 学院(系): 软件学院 专业: 软件工程

学生姓名: 胡晓波 学号: 68107183 指导教师(职称): 张枫(讲师) 评阅教师: 完成日期: 2011-4-1 南阳理工学院 Nanyang Institute of Technology 动态排序算法演示软件设计 动态排序算法演示软件设计 ——动态演示的实现 软件工程胡晓波 [摘要]不管在现实世界还是在软件设计中,排序都是一种非常普遍的应用。排序算法是数据结构这门课程核心内容之一。它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。学习排序算法是为了将实际问题中所涉及到的对象在计算机中对它们进行处理。该演示系统可以通过操作把数据结构中的主要排序常见的排序算法(有冒泡排序、选择排序、直接插入排序、希尔排序、快速排序、归并排序等)表示出来。系统具有两种模式:单步演示,用于教学和认知排序过程;统计模式,可以生成大规模数据验证各种算法的时间性能。并且在单步演示模式下,可以统计数据交换的次数。 [关键词]数据结构;排序算法;动态演示 1 动态排序算法演示软件设计 Sorting algorithms dynamic demonstration of software design

数据结构课程设计排序算法总结

排序算法: (1) 直接插入排序 (2) 折半插入排序(3) 冒泡排序 (4) 简单选择排序 (5) 快速排序(6) 堆排序 (7) 归并排序 【算法分析】 (1)直接插入排序;它是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好的序的有序表中,从而得到一个新的、记录数增加1的有序表。 (2)折半插入排序:插入排序的基本操作是在一个有序表中进行查找和插入,我们知道这个查找操作可以利用折半查找来实现,由此进行的插入排序称之为折半插入排序。折半插入排序所需附加存储空间和直接插入相同,从时间上比较,折半插入排序仅减少了关键字间的比较次数,而记录的移动次数不变。 (3)冒泡排序:比较相邻关键字,若为逆序(非递增),则交换,最终将最大的记录放到最后一个记录的位置上,此为第一趟冒泡排序;对前n-1记录重复上操作,确定倒数第二个位置记录;……以此类推,直至的到一个递增的表。 (4)简单选择排序:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。 (5)快速排序:它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 (6)堆排序: 使记录序列按关键字非递减有序排列,在堆排序的算法中先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录交换,然后对序列中前n-1记录进行筛选,重新将它调整为一个“大顶堆”,如此反复直至排序结束。 (7)归并排序:归并的含义是将两个或两个以上的有序表组合成一个新的有序表。假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序称为2-路归并排序。 【算法实现】 (1)直接插入排序: void InsertSort(SqList &L){ for(i=2;i<=L.length ;i++) if(L.elem[i]L.elem[0];j--) L.elem [j+1]=L.elem [j]; L.elem [j+1]=L.elem[0]; } } (2)折半插入排序:

数据结构课程设计报告

《数据结构课程设计》报告 题目:课程设计题目2教学计划编制 班级:700 学号:09070026 姓名:尹煜 完成日期:2011年11月7日

一.需求分析 本课设的任务是根据课程之间的先后的顺序,利用拓扑排序算法,设计出教学计划,在七个学期中合理安排所需修的所有课程。 (一)输入形式:文件 文件中存储课程信息,包括课程名称、课程属性、课程学分以及课程之间先修关系。 格式:第一行给出课程数量。大于等于0的整形,无上限。 之后每行按如下格式“高等数学公共基础必修6.0”将每门课程的具体信息存入文件。 课程基本信息存储完毕后,接着给出各门课程之间的关系,把每门课程看成顶点,则关系即为边。 先给出边的数量。大于等于0的整形。 默认课程编号从0开始依次增加。之后每行按如下格式“1 3”存储。此例即为编号为1的课程与编号为3的课程之间有一条边,而1为3的前驱,即修完1课程才能修3课程。 例: (二)输出形式:1.以图形方式显示有向无环图

2.以文本文件形式存储课程安排 (三)课设的功能 1.根据文本文件中存储的课程信息(课程名称、课程属性、课程学分、课程之间关系) 以图形方式输出课程的有向无环图。 拓展:其显示的有向无环图可进行拖拽、拉伸、修改课程名称等操作。 2.对课程进行拓扑排序。 3.根据拓扑排序结果以及课程的学分安排七个学期的课程。 4.安排好的教学计划可以按图形方式显示也可存储在文本文件里供用户查看。 5.点击信息菜单项可显示本人的学好及姓名“09070026 尹煜” (四)测试数据(见六测设结果)

二.概要设计 数据类型的定义: 1.Class Graph即图类采用邻接矩阵的存储结构。类中定义两个二维数组int[][] matrix 和Object[][] adjMat。第一个用来标记两个顶点之间是否有边,为画图服务。第二个 是为了实现核心算法拓扑排序。 2.ArrayList list用来存储课程信息。DrawInfo类是一个辅助画图的类,其中 包括成员变量num、name、shuxing、xuefen分别代表课程的编号、名称、属性、 学分。ArrayList是一个DrawInfo类型的数组,主要用来在ReadFile、DrawG、DrawC、SaveFile、Window这些类之间辅助参数传递,传递课程信息。 3.Class DrawInfo, 包括int num;String name;String shuxing;float xuefen;四个成员变量。 4.Class Edge包括int from;int to;double weight;三个成员变量。 5.Class Vertex包括int value一个成员变量。 主要程序的流程图: //ReadFile.java

冒泡排序算法和递归算法

实验一、冒泡排序算法和递归算法 一、实验目的与要求 1.熟悉C/C++语言的集成开发环境; 2.通过本实验加深对冒泡排序算法和递归过程的理解。 二、实验内容: 掌握冒泡排序算法和递归算法的概念和基本思想,分析并掌握“汉诺塔”问题的递归算法。 三、实验题 1、分析并写出冒泡排序算法,输入数列{43,1,23,100,90,9,19,17},写出程序运行结果。 算法如下: BUBBLE SORT (A) 1 for i ←1 to length [A ] 2 do for j ←length [A ]downto i + 1 3 do if A [j ]< A [j -1] 4 then exchange A [j ]A [j -1] C 程序如下: #include void main() { int a[8]; int i,j,t; printf("Please input 8 number:\n"); for(i=0;i<8;i++) scanf("%d",&a[i]); printf("\n"); for(i=0;i<7;i++) for(j=0;j<7-i;j++) if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } printf("\nThe number are:\n"); for(i=0;i<8;i++) printf("%5d",a[i]); } 程序运行结果如下:

2、写出汉诺塔问题的递归算法程序。写出n=3和n=4时,圆盘的移动总次数和每步移动过程。 规模为n的算法如下: HANOI(n,X,Y,Z) 1 if n=1 2 then MOVE(X,1,Z) 3 else HANOI(n-1,X,Z,Y) 4 MOVE(X,n,Z) 5 HANOI(n-1,Y,X,Z) 实现算法程序如下: #include #include #include using namespace std; int count=0; void move(int n,char a,char b); void hanoi(int n, char a,char b, char c); int main() { int number; char a,b,c; a='A'; b='B'; c='C'; SYSTEMTIME sys1,sys2;

数据结构课程设计报告---几种排序算法的演示(附源代码)

数据结构课程设计报告 —几种排序算法的演示 时间:2010-1-14 一需求分析 运行环境 Microsoft Visual Studio 2005

程序所实现的功能 对直接插入排序、折半插入排序、冒泡排序、简单选择排序、快速排序、堆排序、归并排序算法的演示,并且输出每一趟的排序情况。 程序的输入(包含输入的数据格式和说明) <1>排序种类三输入 <2>排序数的个数的输入 <3>所需排序的所有数的输入 程序的输出(程序输出的形式) <1>主菜单的输出 <2>每一趟排序的输出,即排序过程的输出 二设计说明 算法设计思想 <1>交换排序(冒泡排序、快速排序) 交换排序的基本思想是:对排序表中的数据元素按关键字进行两两比较,如果发生逆序(即排列顺序与排序后的次序正好相反),则两者交换位置,直到所有数据元素都排好序为止。 <2>插入排序(直接插入排序、折半插入排序) 插入排序的基本思想是:每一次设法把一个数据元素插入到已经排序的部分序列的合适位置,使得插入后的序列仍然是有序的。开始时建立一个初始的有序序列,它只包含一个数据元素。然后,从这个初始序列出发不断插入数据元素,直到最后一个数据元素插到有序序列后,整个排序工作就完成了。 <3>选择排序(简单选择排序、堆排序)

选择排序的基本思想是:第一趟在有n个数据元素的排序表中选出关键字最小的数据元素,然后在剩下的n-1个数据元素中再选出关键字最小(整个数据表中次小)的数据元素,依次重复,每一趟(例如第i趟,i=1,…,n-1)总是在当前剩下的n-i+1个待排序数据元素中选出关键字最小的数据元素,作为有序数据元素序列的第i个数据元素。等到第n-1趟选择结束,待排序数据元素仅剩下一个时就不用再选了,按选出的先后次序所得到的数据元素序列即为有序序列,排序即告完成。 <4>归并排序(两路归并排序) 两路归并排序的基本思想是:假设初始排序表有n个数据元素,首先把它看成是长度为1的首尾相接的n个有序子表(以后称它们为归并项),先做两两归并,得n/2上取整个长度为2的归并项(如果n为奇数,则最后一个归并项的长度为1);再做两两归并,……,如此重复,最后得到一个长度为n的有序序列。 程序的主要流程图

相关主题
文本预览
相关文档 最新文档