算法设计基础之排列、整数划分、归并排序(VC)
![算法设计基础之排列、整数划分、归并排序(VC)](https://imgs.360docs.net/imgdf/1q59b2umupyt8s5n4ebb68akzan09lq0-f1.webp)
![算法设计基础之排列、整数划分、归并排序(VC)](https://imgs.360docs.net/imgdf/1q59b2umupyt8s5n4ebb68akzan09lq0-d2.webp)
实验内容:
1. 排列
1、代码
#include
using namespace std;
template
void Perm(T list[], int k, int m) //;排列子函数{ //生成list [k:m ]的所有排列方式
int i;
if (k == m) {//输出一个排列方式
for (i = 0; i <= m; i++)
cout << list [i];
cout << endl;
}
else // list[k:m ]有多个排列方式
// 递归地产生这些排列方式
for (i=k; i <= m; i++)
{
Swap (list[k], list[i]);
Perm (list, k+1, m);
Swap (list [k], list [i]);
}
}
template
inline void Swap(T& a, T& b) //交换子函数
{
T temp = a; a = b; b = temp;
}
void main() //主函数
{
int a[] = {1,2,3,4,5,6,7,8};
Perm(a,0,3); //调用全排列子函数,a[0]~a[3]的全排列}
2、运行结果
2. 整数划分
1、代码
#include
int a[100]={0};
void shuchu(int m) //输出函数{
int i;
for(i=0;i<=m-1;i++)
printf("%d ",a[i]);
printf("\n");
}
void fenjie(int n,int m) //分解函数{
int i;
if(n==0)
shuchu(m); //给的数字为0 ,输出0
else //若不为0,递归调用直到根节点 for(i=n;i>=1;i--)
if(m==0||i<=a[m-1])
{
a[m]=i;
fenjie(n-i,m+1);
}
}
void main(void) //主函数
{
int n,i,m=0;
printf("please input a number(0 scanf("%d",&n); //输入要分解的整数 fenjie(n,m); //调用函数 } 2、运行结果 3. 归并排序 1、代码 #include #include void merge(int number[],int first,int last,int mid) { int number_temp[10]={0}; int i=first,j=mid+1,k; for(k=0;k<=last-first;k++) { if (i==mid+1) { number_temp[k]=number[j++]; continue; } if (j==last+1) { number_temp[k]=number[i++]; continue; } if (number[i] } for (i=first,j=0;i<=last;i++,j++) number[i] = number_temp[j]; } void merge_sort(int number[],int first,int last) { int mid=0; if(first { mid=(first+last)/2; merge_sort(number,first,mid); merge_sort(number,mid+1,last); merge(number,first,last,mid); } } int main() { int number[10]={0},n,i; scanf("%d",&n); for(i=0;i scanf("%d",&number[i]); merge_sort(number,0,n-1); for(i=0;i printf("%d ",number[i]); system("pause"); return 0; } 2、运行结果 第一个数字输入排序数字个数,后面输入要排序的数字