程序设计挑战式课程设计极限挑战挑战,不是为着征服自然,而是为着突破自我,超越自我生命有极限,思想无极限,高度有极限,境界无极限作业名称:算法演示程序 学 院:航海学院 班 级:03011403 学 号:2013300951 姓 名:苏和 团队组成:西北工业大学2022年4月25日1、问题与背景(描述程序所要解决的问题或应用背景)2、开发工具(列出所使用的开发工具和第3方开发库)3、主要功能(详细说明程序的功能)4、设计内容(详细描述解决问题的原理和方法、算法、数据结构等)5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明)6、函数模块(程序中各个函数的原型声明及其说明)7、使用说明(运行程序的小型说明书)8、程序开发总结(简要叙述编写本作业的收获与思考)进行了巩固和训练。
9、运行截图(附上程序运行的截图画面,至少有1幅,截图越翔实得分越高)Windows中抓取当前活动窗口:Alt + Print Screen,抓取全屏:Print Screen。
或者使用HyperSnap等软件(百度搜索)。
10、源程序(附上程序源代码,若是多个文件,标出文件名)1.sort.cpp#include <stdio.h>#include <stdlib.h>#include "myh.h"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(" 请输入所要排序的数据:");printf("\n\n\t");for(i=0;i<n;i++) scanf("%d",&a[i]);//输入数据printf("\n");printf(" 请选择一种排序方法:\n\n");printf("\t1.冒泡排序\t 2.选择排序\t 3.插入排序\n");printf("\t4.快速排序\t 5.堆排序\t 6.归并排序\t 7.基数排序\n\n"); printf(" 您的选择是:");scanf("%d",&k);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;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=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;printf("\n\n\n");}return 0;}2.sort_fun.cpp#include "myh.h"#include <math.h>#include <stdlib.h>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]){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){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];//逐个后移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];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){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){//堆排序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]; //然后将新的无序区调整为堆(亦称重建堆)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);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));//申请空间,用以放置合并后的序列if(!R1)return;while(i<=m&&j<=high)R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];while(i<=m)R1[p++]=R[i++];while(j<=high)R1[p++]=R[j++];for(p=0,i=low;i<=high;p++,i++) R[i]=R1[p];//两两比较选择相对小的元素放入到合并空间}void Bucket(int *p , int n){//基数排序int maxNum= findMaxNum( p , n );//获取数组中的最大数int loopTimes = getLoopTimes(maxNum);//获取最大数的位数,次数也是再分配的次数。
int i;for( i = 1 ; i <= loopTimes ; i++) {//对每一位进行桶分配sort2(p , n , i );}}int getLoopTimes(int num){//获取数字的位数int j = 1 ;int temp = num/10;while( temp != 0 ) {j++;temp = temp / 10;}return j;}int findMaxNum( int *p , int n){//查询数组中的最大数int i ;int m = 0;for( i = 0 ; i < n ; i++) {if(*(p+i) > m) {m = *(p+i);}}return m;}void sort2(int *p , int n , int loop){//将数字分配到各自的桶中,然后按照桶的顺序输出排序结果int buckets[100][100] ;//建立一组桶int tempNum = (int) pow(10 , loop-1);int i , j ;for( i = 0 ; i < n ; i++ ) {//求桶的index的除数int row_index = (*(p+i) / tempNum) % 10;for(j = 0 ; j < 20 ; j++) {if(buckets[row_index][j] ==NULL) {buckets[row_index ][j] = *(p+i) ;break;}}}int k = 0 ;//将桶中的数,倒回到原有数组中for(i = 0 ; i < 10 ; i++) {for(j = 0 ; j < 20 ; j++) {if(buckets[i][j] != NULL) {*(p + k ) = buckets[i][j] ;buckets[i][j]=NULL;k++;}}}}3.myh.hvoid Bubble(int a[],int n);void Selection(int a[],int n);void Insertion(int a[],int n);void Quick(int a[],int n,int left,int right);void Heap(int a[] , int n);void MergeSort(int R[],int low,int high); void Bucket(int *p , int n);void Merge(int *R,int low,int m,int high); int getLoopTimes(int num);int findMaxNum( int *p , int n);void sort2(int *p , int n , int loop);。