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;
}
运行结果: