第十五周项目一
来源:互联网 发布:led字幕软件 编辑:程序博客网 时间:2024/06/05 18:46
【项目一 - 验证算法(3)】
/* *烟台大学计算机与控制工程学院 *作 者:张雨萌 *完成日期:2017年12月7日 */问题描述:用序列{57, 40, 38, 11, 13, 34, 48, 75, 6, 19, 9, 7}作为测试数据,运行并本周视频中所讲过的算法对应 程序,观察
运行结果并深刻领会算法的思路和实现方法:
(7)归并排序;(8)基数排序
程序及代码:
(7)归并排序
#include <stdio.h>#include <malloc.h>#define MaxSize 20typedef int KeyType; //定义关键字类型typedef char InfoType[10];typedef struct //记录类型{ KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType} RecType; //排序的记录类型定义void Merge(RecType R[],int low,int mid,int high){ RecType *R1; int i=low,j=mid+1,k=0; //k是R1的下标,i、j分别为第1、2段的下标 R1=(RecType *)malloc((high-low+1)*sizeof(RecType)); //动态分配空间 while (i<=mid && j<=high) //在第1段和第2段均未扫描完时循环 if (R[i].key<=R[j].key) //将第1段中的记录放入R1中 { R1[k]=R[i]; i++; k++; } else //将第2段中的记录放入R1中 { R1[k]=R[j]; j++; k++; } while (i<=mid) //将第1段余下部分复制到R1 { R1[k]=R[i]; i++; k++; } while (j<=high) //将第2段余下部分复制到R1 { R1[k]=R[j]; j++; k++; } for (k=0,i=low; i<=high; k++,i++) //将R1复制回R中 R[i]=R1[k];}void MergePass(RecType R[],int length,int n) //对整个数序进行一趟归并{ int i; for (i=0; i+2*length-1<n; i=i+2*length) //归并length长的两相邻子表 Merge(R,i,i+length-1,i+2*length-1); if (i+length-1<n) //余下两个子表,后者长度小于length Merge(R,i,i+length-1,n-1); //归并这两个子表}void MergeSort(RecType R[],int n) //自底向上的二路归并算法{ int length; for (length=1; length<n; length=2*length) //进行log2n趟归并 MergePass(R,length,n);}int main(){ int i,n=10; RecType R[MaxSize]; KeyType a[]= {9,8,7,6,5,4,3,2,1,0}; for (i=0; i<n; i++) R[i].key=a[i]; printf("排序前:"); for (i=0; i<n; i++) printf("%d ",R[i].key); printf("\n"); MergeSort(R,n); printf("排序后:"); for (i=0; i<n; i++) printf("%d ",R[i].key); printf("\n"); return 0;}运行结果:
(8)基数排序
#include <stdio.h>#include <malloc.h>#include <string.h>#define MAXE 20 //线性表中最多元素个数#define MAXR 10 //基数的最大取值#define MAXD 8 //关键字位数的最大取值typedef struct node{ char data[MAXD]; //记录的关键字定义的字符串 struct node *next;} RecType;void CreaLink(RecType *&p,char *a[],int n);void DispLink(RecType *p);void RadixSort(RecType *&p,int r,int d) //实现基数排序:*p为待排序序列链表指针,r为基数,d为关键字位数{ RecType *head[MAXR],*tail[MAXR],*t; //定义各链队的首尾指针 int i,j,k; for (i=0; i<=d-1; i++) //从低位到高位循环 { for (j=0; j<r; j++) //初始化各链队首、尾指针 head[j]=tail[j]=NULL; while (p!=NULL) //对于原链表中每个结点循环 { k=p->data[i]-'0'; //找第k个链队 if (head[k]==NULL) //进行分配 { head[k]=p; tail[k]=p; } else { tail[k]->next=p; tail[k]=p; } p=p->next; //取下一个待排序的元素 } p=NULL; //重新用p来收集所有结点 for (j=0; j<r; j++) //对于每一个链队循环 if (head[j]!=NULL) //进行收集 { if (p==NULL) { p=head[j]; t=tail[j]; } else { t->next=head[j]; t=tail[j]; } } t->next=NULL; //最后一个结点的next域置NULL //以下的显示并非必要 printf(" 按%d位排序\t",i); DispLink(p); }}void CreateLink(RecType *&p,char a[MAXE][MAXD],int n) //采用后插法产生链表{ int i; RecType *s,*t; for (i=0; i<n; i++) { s=(RecType *)malloc(sizeof(RecType)); strcpy(s->data,a[i]); if (i==0) { p=s; t=s; } else { t->next=s; t=s; } } t->next=NULL;}void DispLink(RecType *p) //输出链表{ while (p!=NULL) { printf("%c%c ",p->data[1],p->data[0]); p=p->next; } printf("\n");}int main(){ int n=10,r=10,d=2; int i,j,k; RecType *p; char a[MAXE][MAXD]; int b[]= {75,23,98,44,57,12,29,64,38,82}; for (i=0; i<n; i++) //将b[i]转换成字符串 { k=b[i]; for (j=0; j<d; j++) //例如b[0]=75,转换后a[0][0]='7',a[0][1]='5' { a[i][j]=k%10+'0'; k=k/10; } a[i][j]='\0'; } CreateLink(p,a,n); printf("\n"); printf(" 初始关键字\t"); //输出初始关键字序列 DispLink(p); RadixSort(p,10,2); printf(" 最终结果\t"); //输出最终结果 DispLink(p); printf("\n"); return 0;}
知识点总结:
学习了归并排序和基数排序
心得体会:
当看视频时看到基数排序排完以后我就觉得非常神奇,开始觉得这种方法很不靠谱,但是排序出来的那一刻看到一个有序数列
我就惊呆了,不得不佩服写出这种方法来的人。
阅读全文
0 0
- 第十五周项目一
- 第十五周--项目一
- 第十五周项目一
- 第十五周项目一
- 第十五周项目一
- 第十五周项目一-工资项目1
- 第十五周项目一----数组类
- 第十五周项目一折腾二维数组
- 第十五周项目一-折腾二维数组
- 第十五周项目一 观察指针
- 第十五周项目一:内部寻内幕
- 第十五周项目三:OJ(一)
- 第十五周项目一数组的排序
- 第十五周项目一~验证算法
- 第十五周--项目一--验证算法
- 第十五周 项目一 验证算法
- 第十五周 项目一 验证算法
- 第十五周 项目一-验证算法
- 第四周 【项目5- 循环双链表应用】
- 第四周-项目四-猴子选大王
- 通过 SSH 实现 TCP / IP 隧道(端口转发)
- 第十五周 【项目2
- 有趣的二进制手表问题。
- 第十五周项目一
- 第十三周项目2
- 第十五周内部排序(2)项目1---(1)直接插入排序
- Spring、HikariCP、Mybatis、Oracle 配置HikariCP数据库连接池
- linux常见命令
- 工作中常用的Repo和Git的一些操作[随时更新]
- Android SDK下载安装
- Maven
- B2B2C商城系统WSTMart二次开发前台标签说明