算法设计与分析第三次课后作业

文章介绍了快速排序算法,基于分治思想,通过选择基准将序列分为两部分并递归排序。同时,展示了用分治法求解整数序列最大最小元素的算法,以及利用分治法计算xn的算法,强调了基准选择和递归在分治策略中的重要性。
摘要由CSDN通过智能技术生成

1.快速排序算法是根据分治策略来设计的,简述其基本思想。

快速排序的基本思想:快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

快速排序的三个步骤:(1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot)(2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大(3)递归地对两个序列进行快速排序,直到序列为空或者只有一个元素。

选择基准的方式:对于分治算法,当每次划分时,算法若都能分成两个等长的子序列时,那么分治算法效率会达到最大。也就是说,基准的选择是很重要的。选择基准的方式决定了两个分割后两个子序列的长度,进而对整个算法的效率产生决定性影响。最理想的方法是,选择的基准恰好能把待排序序列分成两个等长的子序列。

2.设计一个算法,采用分治法求一个整数序列中的最大最小元素。//分治法求数列最大最小值
#define _CRT_NO_SECURE_WARNINGS
 
#include<stdio.h>
#include<iostream>
 
using namespace std;
 
int str[2] = { 0 };
 
//i是数组首位标记,j是数组的末尾标记
int* MAXMIN(int i, int j, int* a) {
 int max = 0;
 int min = 0;
 int mid = 0;
 int lmax = 0;
 int lmin = 0;
 int rmax = 0;
 int rmin = 0;
 int* ltem;
 int* rtem;
 //i,j指向同一个位置,相当于一个元素
 if (i == j) {
  max = a[i];
  str[0] = max;
  min = a[i];
  str[1] = min;
 }
 //i和j差一个位置,相当于两个元素
 else if (i == j - 1) {
  //a[i]元素小
  if (a[i] < a[j]) {
   max = a[j];
   str[0] = max;
   min = a[i];
   str[1] = min;
  }
  //a[j]元素小
  else {
   max = a[i];
   str[0] = max;
   min = a[j];
   str[1] = min;
  }
 }
 //i和j指向一个数组,分治
 else {
  mid = (i + j) / 2;
  //对于i到mid的数求最大最小值
  ltem = MAXMIN(i, mid, a);
  lmax = *ltem;
  lmin = *(ltem + 1);
  //对于mid+1到j的数求最大最小值
  rtem = MAXMIN(mid + 1, j, a);
  rmax = *rtem;
  rmin = *(rtem + 1);
  //对比左右数列的最大最小值
  if (lmax > rmax) {
   max = lmax;
   str[0] = max;
  }
  else {
   max = rmax;
   str[0] = max;
  }
  if (lmin > rmin) {
   min = rmin;
   str[1] = min;
  }
  else {
   min = lmin;
   str[1] = min;
  }
 }
 return str;
}
 
int main() {
 int a[100] = { 0 };
 int j = 0;
 int k = 0;
 int* p;
 char c ='0';
  
 cout << "请输入要求最大最小值的数列:"<<endl;
 for (j = 0;j < 100;j++) {
  cin >> a[j];
  if (getchar() == '\n') {
   break;
  }
 }
 
 p=MAXMIN(0, j, a);
 cout << "此序列最大值为:" << *p << endl;
 cout << "此序列最小值为:" << *(p + 1) << endl;
 system("pause");
 return 0;
}
 
 运行结果:

3.设计一个算法,采用分治法求xn。

#include<iostream>
using namespace std;
double digui(double x,int n){
    if(n==1)
        return x;
    if(n%2==0)
        return digui(x,n/2)*digui(x,n/2);
    else
    return digui(x,(n-1)/2)*digui(x,(n-1)/2)*x;
}
int main(){
    double x;
    int n;
    cin>>x>>n;
    if(n<0){         //考虑n为负数时的情况
        cout<<1/digui(x,-n);
    }
    else{
    if(n==0){       //考虑n=1时的情况
        cout<<1;
    }
    else
    cout<<digui(x,n);
    }
return 0;
}

运行结果:

 

 

矩阵相似的充要条件是它们有相同的特征值和相同的特征向量。具体来说,设 A 和 B 是 n 阶矩阵,如果存在一个可逆矩阵 P,使得 P^{-1}AP = B,则称 A 和 B 是相似的。 矩阵相似具有以下性质: 1. 相似矩阵具有相同的特征值。设 A 和 B 是相似矩阵,它们有相同的特征值 λ_i。这是因为 P^{-1}AP 和 B 有相同的特征值,而 P^{-1}AP 和 B 是相似的,所以 A 和 B 有相同的特征值。 2. 相似矩阵具有相同的特征向量。设 A 和 B 是相似矩阵,它们有相同的特征值 λ_i 和对应的特征向量 v_i。这是因为 P^{-1}AP 和 B 有相同的特征向量,而 P^{-1}AP 和 B 是相似的,所以 A 和 B 有相同的特征向量。 3. 相似矩阵具有相同的迹。设 A 和 B 是相似矩阵,则它们的迹 Tr(A) 和 Tr(B) 相等。这是因为 Tr(A) = Tr(P^{-1}AP) = Tr(P(P^{-1}AP)) = Tr(PP^{-1}AP) = Tr(A)。 4. 相似矩阵具有相同的行列式。设 A 和 B 是相似矩阵,则它们的行列式 det(A) 和 det(B) 相等。这是因为 det(A) = det(P^{-1}AP) = det(P^{-1})det(A)det(P) = det(A)。 5. 相似矩阵具有相同的秩。设 A 和 B 是相似矩阵,则它们的秩 rank(A) 和 rank(B) 相等。这是因为矩阵相似不改变矩阵的秩。 需要注意的是,相似矩阵是一个等价关系,即满足反身性、对称性和传递性。也就是说,对于任意的矩阵 A,它和自身是相似的;如果 A 和 B 是相似的,则 B 和 A 也是相似的;如果 A 和 B 是相似的,B 和 C 是相似的,则 A 和 C 也是相似的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值