算法设计与分析:递归与分治策略

第1关:快速排序

100

  • 任务要求
  • 参考答案
  • 评论6
  • 任务描述
  • 相关知识
  • 编程要求
  • 测试说明

任务描述

本关任务:编写快速排序算法,能够对数组进行快速排序。

相关知识

为了完成本关任务,你需要掌握:递归的基本思想,快速排序的方法。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

开始你的任务吧,祝你成功!

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[111111];
void f(int l,int r)
{
	int i,j,t,temp;
	if(l>r)
	return;
	temp=a[l];
	i=l,j=r;
	while(i!=j)
	{
		while(a[j]>=temp&&i<j)
		j--;
		while(a[i]<=temp&&i<j)
		i++;
		if(i<j)
		swap(a[i],a[j]);
	}
	a[l]=a[i];
	a[i]=temp;
	f(l,i-1);
	f(i+1,r);
}
int main()
{
	int l,i,j,k,n;
	while(scanf("%d",&n)!=EOF)
	{
		for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
		f(1,n);
		printf("%d",a[1]);
		for(i=2;i<=n;i++)
		printf(" %d",a[i]);
		printf("
"); 
	}
}

第2关:归并排序

100

  • 任务要求
  • 参考答案
  • 评论6
  • 任务描述
  • 编程要求
  • 测试说明

任务描述

本关任务:归并排序。 ####相关知识 为了完成本关任务,你需要掌握归并排序知识。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

测试输入: 30 62 42 73 23 43 91 86 99 21 70 80 11 52 43 18 3 48 22 41 44 37 18 92 23 66 50 80 36 58 23 预期输出: 3 11 18 18 21 22 23 23 23 36 37 41 42 43 43 44 48 50 52 58 62 66 70 73 80 80 86 91 92 99


开始你的任务吧,祝你成功!

#include<iostream>
using namespace std;

//归并过程
void merge(int arr[], int l, int mid, int r){
    //定义左右两个数组left[]和right[]
    int n1 = mid - l + 1;
    int n2 = r - mid;
    int left[n1], right[n2];

    //将元素分别存入left[]和right[]中
    for(int i = 0; i < n1; i++){
        left[i] = arr[l + i];
    }
    for(int j = 0; j < n2; j++){
        right[j] = arr[mid + 1 + j];
    }

    //初始化i、j、k
    int i = 0, j = 0, k = l;

    //将较小的元素依次放入存放排序结果的数组中
    while(i < n1 && j < n2){
        if(left[i] <= right[j]){
            arr[k++] = left[i++];
        }
        else{
            arr[k++] = right[j++];
        }
    }

    //将left[]或right[]中还有剩余的元素全部放入存放排序结果的数组中
    while(i < n1){
        arr[k++] = left[i++];
    }
    while(j < n2){
        arr[k++] = right[j++];
    }
}

//递归
static void mergeSort(int arr[], int l, int r){
    if(l >= r){ //递归终止条件
        return;
    }

    int mid = (l + r) / 2; //计算中间索引
    mergeSort(arr, l, mid); //对左半部分进行递归排序
    mergeSort(arr, mid+1, r); //对右半部分进行递归排序
    merge(arr, l, mid, r); //归并两个子数组
}

//归并排序整个数组
void mergeSort(int arr[], int n){
    //如果数组为空或只有一个元素,不需要排序
    if(arr == NULL || n < 2){
        return;
    }
    mergeSort(arr,0,n-1);
}


int main(){
    int n;
    cin >> n;
    int arr[n];
    for(int i = 0; i < n; i++) cin >> arr[i];

    mergeSort(arr, n);

    for(int i = 0; i < n; i++){
        cout << arr[i] << " ";
    }

    return 0;
}

第3关:整数因子分解

100

  • 任务要求
  • 参考答案
  • 评论6
  • 任务描述
  • 相关知识
  • 编程要求
  • 测试说明

任务描述

本关任务:整数因子分解问题。

相关知识

大于1的正整数n可以分解为:n=x1*x2*…*xm。例如,当n=12 时,共有8种不同的分解式:

12=12; 12=6*2; 12=4*3; 12=3*4; 12=3*2*2; 12=2*6; 12=2*3*2; 12=2*2*3。

对于给定的正整数n,计算n共有多少种不同的分解式。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

输入输出: Input

输入数据只有一行,有1个正整数n (1≤n≤2000000000)。

Output

将计算出的不同的分解式数输出。

Sample Input 12 Sample Output 8

注意:1.代码中ff[N]作为全局变量了,所以在函数体里面不用重新声明。2、请注意代码的效率。

开始你的任务吧,祝你成功!

#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
int ff[N];
int f(int n)
{
    int sum = 1;
    if(n < N && ff[n] != 0) return ff[n];
    for(int i = 2; i <= sqrt(n); i++)
    {
        if(n % i == 0)
        {
            if(i * i == n)
                sum += f(i);  
            else    
                sum += f(i) + f(n / i);      
        }
    }
    if(n < N) ff[n] = sum;
    return sum;
}
int main()
{    
    int n;
    scanf("%d", &n);
    memset(ff, 0, sizeof(ff));
    printf("%d", f(n));
    return 0;
}