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

第1关:快速排序

任务描述

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

相关知识

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

编程要求

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

测试说明

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

#include<iostream>
using namespace std;
 
void print(int a[], int n)
{  
    for(int j= 0; j<n; j++)
	{  
           cout<<a[j] <<" ";  
        }  
}  
 
void quickSort(int a[], int low ,int high)
{
 /********************begin***********************/
   if(low>=high){
       return;
   } 
   int temp;
   int i=low+1;
   int pivot=a[low];
   for(int j=low+1 ; j<=high; j++){
       if (a[j]<pivot) {
           temp=a[i];
           a[i]=a[j];
            a[j]=temp;
            i++;
       }
   }
    temp=a[low];
    a[low]=a[i-1];
    a[i-1]=temp;
   
    quickSort(a,low,i-2);
    quickSort(a,i,high);
 
 /********************end *************************/
}
 
int main()
{  
	int n;
	cin>>n;
	int *a = new int[n];
	for (int i=0;i<n;i++)
	{
		cin>>a[i];
	}
   
 /********************begin***********************/

    quickSort(a,0,n-1);
    print(a,n);
 
 /********************end *************************/
} 
 
 

第2关:归并排序

任务描述

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

编程要求

请仔细阅读右侧代码,根据方法内的提示,在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){
/********begin************/
	int i,j,k;
    int n1=mid-l+1;
    int n2=r-mid;

    int L[n1],R[n2];
    for(int i=0 ; i<n1; i++){
        L[i]=arr[l+i];

    }
    for(int j=0 ; j<n2; j++){
        R[j]=arr[mid+1+j];
    }
    i=0;
    j=0;
    k=l;
    while(i<n1&& j<n2){
        if(L[i]<=R[j]){
            arr[k]=L[i];
            i++;
           }
       
        else{
            arr[k]=R[j];
            j++;
        }
        k++;
    }

    while(i<n1){
          arr[k]=L[i];
            i++;
            k++;
    }
      while(j<n2){
           arr[k]=R[j];
            j++;
            k++;
    }
/********end**************/
}
 
//递归
static void mergeSort(int arr[], int l, int r){
	/********begin************/
	if(l<r){
        int mid=l+(r-l)/2;
        mergeSort(arr,l,mid);
        mergeSort(arr,mid+1,r);
        merge(arr,l,mid,r);
    }
	/********end**************/
}
 
//归并排序整个数组
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关:整数因子分解

任务描述

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

相关知识

大于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)
{
 /**********begin****************/
 int ans=0;
for(int i=2;i<=sqrt(n);i++){
    if(n%i==0){
    if(n/i==i)ans+=f(i);
    else{
    ans+=f(i);
    ans+=f(n/i);
   }
   }
 
    }
  return ans+1;
 /**********end******************/
}
 
int main()
{    
    int n;
    scanf("%d", &n);
    memset(ff, 0, sizeof(ff));
    printf("%d", f(n));
    return 0;
}
 

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值