noj大作业

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.打开程序,出现欢迎界面
2.输入所要排序的数据个数(N<=100)
3.输入所要排序的数据
4.选择一种排序方法:
1.冒泡排序2.选择排序3.插入排序
4.快速排序5堆排序6归并排序
7.基数排序
5.选择排列方式:1.从小到大2.从大到小
6.程序输出结果
7.按Q键并确认退出,其他任意键继续,再次回到欢迎界面
7.基数排序
基数排序法又称“桶子法”(bucketsort)或binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用。
对数据来说,首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中。接下来将这些桶子中的数值重新串接起来。接着再进行一次分配,这次是根据十位数来分配。接下来将这些桶子中的数值重新串接起来。重复以上过程直到最高位,这时候整个数列已经排序完毕。
k--;
if(k==-1)break;
}
a[k+1]=t;//插入原数据
}
}
void Quick(int a[],int n,int left,int right){
//快速排序,left、right分别为数组左右边界
int i,j,t;
if(left<right){
i=left;
j=right+1;
8、程序开发总结(简要叙述编写本作业的收获与思考)
通过本次编程我了解到C语言的博大精深和自己的不足,在思维的碰撞中提高了自己,同时也学习过到了新的知识,使自己的程序更加逻辑化、条理化。
我也发现了利用身边的一切资源和进行自我学习的重要性,为以后的工作和学习积累了宝贵的经验。
同时我也意识到老师上课强调的细节对我的帮助,有效的对所学知识进行了巩固和训练。
5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明)
工程的名称:排序算法演示程序
包含的程序原文件如下:
主函数、输入和输出数据、显示菜单、选择排序方法
2.
实现7种排序的函数
3.
7种排序函数及其附属函数的声明
6、函数模块(程序中各个函数的原型声明及其说明)
void Bubble(int a[],int n);冒泡排序
9、运行截图(附上程序运行的截图画面,至少有1幅,截图越翔实得分越高)
Windows中抓取当前活动窗口:Alt + Print Screen,抓取全屏:Print Screen。或者使用HyperSnap等软件(百度搜索)。
10、源程序(附上程序源代码,若是多个文件,标出文件名)
<>
#include <>
void Selection(int a[],int n);选择排序
void Insertion(int a[],int n);插入排序
void Quick(int a[],int n,int left,int right);快速排序
void Shift(int a[] , int i , int m);建堆
拓展功能:1.选择不同的排序法进行排序。
2.选择数据正序排列,还是逆序排列。
4、设计内容(详细描述解决问题的原理和方法、算法、数据结构等)
本程序的数据变换主要在数组中进行。
1.冒泡排序
相邻两个记录之间进行比较和互换,使较小的记录逐渐从底部移向顶部。一次排序后最大的记录沉底,再比较前n-1个记录直到最后一次排列时只有两个记录。排列结束后最小的记录自然上浮至第一位。
a[i]=k;
Shift(a,0,i);
}
}
void MergeSort(int R[],int low,int high){//归并排序
int mid;
if(low<high){
mid=(low+high)/2;
MergeSort(R,low,mid);
MergeSort(R,mid+1,high);
if((k<m-1)&&(a[k]<a[k+1])) k ++;
if(t<a[k]){
a[i]=a[k];//使数列成为一棵完全二叉树的存储结构
i=k; //即成为小根堆
k=2*i+1; //ki<=k(2i)且ki<=k(2i+1)(1≤i≤n)
}
else break;
}
a[i]=t;
}
void Heap(int a[] , int n){//堆排序
因此,我将目前比较流行的7种排序法:
1.冒泡排序2.选择排序3.插入排序
4.快速排序5堆排序6归并排序
7.基数排序
加以总结,标明注释,成为这个演示程序,以供交流学习使用。
2、开发工具(列出所使用的开发工具和第3方开发库)
Code::block
3、主要功能(详细说明程序的功能)
基本功能:本程序可实现对100个及以下的数据排列的功能。
if(!R1)
return;
while(i<=m&&j<=high)
R1[p++]=(R[i]<=R[j])R[i++]:R[j++];
Merge(R,low,mid,high);//重复运行
}
}
void Merge(int *R,int low,int m,int high){
int i=low,j=m+1,p=0;
int *R1;
R1=(int *)malloc((high-low+1)*sizeof(int));//申请空间,用以放置合并后的序列
a[left]=a[j];
a[j]=t;
Quick(a,n,left,j-1);
Quick(a,n,j+1,right);//左右半部分分别再次快速排序
}
}
void Shift(int a[] , int i , int m){//建堆
int k,t;
t=a[i];
k=2*i+1;
while(k<m){
printf("\n\n\n");
}
return 0;
}
""
#include <>
#include <>
void Bubble(int a[],int n){//冒泡排序
int i,j,t;
for(j=0;j<n-1;j++)
for(i=0;i<n-1-j;i++)//一趟排序
if(a[i]>a[i+1]){
#include ""
int main()
{
int a[100],n,i,k;
while(1){
printf("\n\t\t\t欢迎使用排序算法演示程序\n\n\n");
printf("请输入所要排序的数据个数N(N<100)=");
scanf("%d",&n);
printf("\n");
printf("请输入所要排序的数据:");
while(1){
while(i+1<n&&a[++i]<a[left]);//向后搜索大于a[left]的数
while(j-1>-1&&a[--j]>a[left]);//向前搜索小于a[left]的数
if(i>=j)break;
t=a[i];
a[i]=a[j];
a[j]=t;//交换
}Biblioteka Baidu
t=a[left];
2.选择排序
第i趟选择排序通过n-i次关键码的比较,从n-i+1个记录中选出关键码最小的记录,并和记录i交换。
3.插入排序
把新插入记录的关键码与已排好序的逐个比较,但找到第一个比其大的记录时,该记录之前即为插入位置k。从序列最后开始到该记录,逐个后移一个单元,将新纪录插入k位置。如果新纪录比其他记录都大,则插入到最后。
void Heap(int a[] , int n);堆排序
void MergeSort(int R[],int low,int high);归并排序
void Merge(int *R,int low,int m,int high);元素比较
void Bucket(int *p , int n);基数排序
4.快速排序
通过一趟排序将要排序的记录分为两部分,其中一部分比另一部分都要小。再按此方法对两组数据分别进行递归快速排序,从而使序列成为有序序列。
5.堆排序
先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区。
再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n]。由于交换后新的根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]调整为堆,直到无序区只有一个元素为止。
t=a[i];
a[i]=a[k];
a[k]=t;//如果不是本身则与相应的a[i]交换
}
}
}
void Insertion(int a[],int n){//插入排序
int i,k,t;
for(i=1;i<n;i++){
t=a[i];
k=i-1;
while(t<a[k]){//与前边的数依次比较
a[k+1]=a[k];//逐个后移
6.归并排序
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
首先申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。设定两个指针,最初位置分别为两个已经排序序列的起始位置。比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。重复直到某一指针超出序列尾。将另一序列剩下的所有元素直接复制到合并序列尾。
int i,k;
for(i=n/2-1;i>=0;i--) Shift(a,i,n);//初始化操作:将a[n]构造为初始堆
for(i=n-1;i>=1;i--){//每一趟排序的基本操作:将当前无序区的
k=a[0]; //堆顶记录a[1]和该区间的最后一个记录交换,
a[0]=a[i]; //然后将新的无序区调整为堆(亦称重建堆)
if(k=1){
for(i=0;i<n;i++) printf("%d ",a[i]);//正序输出
}
else{
for(i=n-1;i>=0;i--) printf("%d ",a[i]);//倒序输出
}
printf("\n\n按Q键并确认退出,其他任意键继续:");
getchar();
if(getchar()=='q') break;
case 7: int *a_p = a;Bucket(a_p,n);break;
}
printf("\n");
printf("请选择排列方式:1.从小到大2.从大到小\n\n");
printf("您的选择是:");
scanf("%d",&k);
printf("\n\n");
printf("结果是:\n\t");
switch(k){
case 1: Bubble(a,n);break;
case 2: Selection(a,n);break;
case 3: Insertion(a,n);break;
case 4: Quick(a,n,0,n-1);break;
case 5: Heap(a,n);break;
case 6: MergeSort(a,0,n-1);break;
作业名称:
算法演示程序
学 院:
航海学院
班 级:
03011403
学 号:
51
姓 名:
苏和
团队组成:
西北工业大学
2020年7月10日
1、问题与背景(描述程序所要解决的问题或应用背景)
C语言经过几十年的发展已经发展出多种多样的的排序方法,网上的解释和代码良莠不齐,许多具有严重的错误,给学习者打来极大的不便。
printf("\n\n\t");
for(i=0;i<n;i++) scanf("%d",&a[i]);泡排序\t 2.选择排序\t 3.插入排序\n");
printf("\t4.快速排序\t 5.堆排序\t 6.归并排序\t 7.基数排序\n\n");
printf("您的选择是:");
scanf("%d",&k);
t=a[i];
a[i]=a[i+1];
a[i+1]=t;//交换
}
}
void Selection(int a[],int n){//选择排序
int i,j,k,t;
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++)
if(a[j]<a[k])k=j;//找出最小数
if(i!=k){
int getLoopTimes(int num);获取数字的位数
int findMaxNum( int *p , int n);查询数组中的最大数
void sort2(int *p , int n , int loop);
将数字分配到各自的桶中,然后按照桶的顺序输出排序结果
7、使用说明(运行程序的小型说明书)
相关文档
最新文档