noj大作业
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);
8、程序开发总结(简要叙述编写本作业的收获与思考)
通过本次编程我了解到C语言的博大精深和自己的不足,在思维的碰撞中提高了自己,同时也学习过到了新的知识,使自己的程序更加逻辑化、条理化。
我也发现了利用身边的一切资源和进行自我学习的重要性,为以后的工作和学习积累了宝贵的经验。
同时我也意识到老师上课强调的细节对我的帮助,有效的对所学知识进行了巩固和训练。
#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("请输入所要排序的数据:");
5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明)
工程的名称:排序算法演示程序
包含的程序原文件如下:
主函数、输入和输出数据、显示菜单、选择排序方法
2.
实现7种排序的函数
3.
7种排序函数及其附属函数的声明
6、函数模块(程序中各个函数的原型声明及其说明)
void Bubble(int a[],int n);冒泡排序
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]; //然后将新的无序区调整为堆(亦称重建堆)
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));//申请空间,用以放置合并后的序列
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);
因此,我将目前比较流行的7种排序法:
1.冒泡排序2.选择排序3.插入排序
4.快速排序5堆排序6归并排序
7.基数排序
加以总结,标明注释,成为这个演示程序,以供交流学习使用。
2、开发工具(列出所使用的开发工具和第3方开发库)
Code::block
3、主要功能(详细说明程序的功能)
基本功能:本程序可实现对100个及以下的数据排列的功能。
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;
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){
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;
6.归并排序
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
首先申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。设定两个指针,最初位置分别为两个已经排序序列的起始位置。比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。重复直到某一指针超出序列尾。将另一序列剩下的所有元素直接复制到合并序列尾。
9、运行截图(附上程序运行的截图画面,至少有1幅,截图越翔实得分越高)
Windows中抓取当前活动窗口:Alt + Print Screen,抓取全屏:Print Scre代码,若是多个文件,标出文件名)
<>
#include <>
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");
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){//堆排序
2.选择排序
第i趟选择排序通过n-i次关键码的比较,从n-i+1个记录中选出关键码最小的记录,并和记录i交换。
3.插入排序
把新插入记录的关键码与已排好序的逐个比较,但找到第一个比其大的记录时,该记录之前即为插入位置k。从序列最后开始到该记录,逐个后移一个单元,将新纪录插入k位置。如果新纪录比其他记录都大,则插入到最后。
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){
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;
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;//交换
}
t=a[left];
作业名称:
算法演示程序
学 院:
航海学院
班 级:
03011403
学 号:
51
姓 名:
苏和
团队组成:
西北工业大学
2020年7月10日
1、问题与背景(描述程序所要解决的问题或应用背景)
C语言经过几十年的发展已经发展出多种多样的的排序方法,网上的解释和代码良莠不齐,许多具有严重的错误,给学习者打来极大的不便。
void Selection(int a[],int n);选择排序
void Insertion(int a[],int n);插入排序