四.快速排序算法分治策略的基本思想。
比大小,再分区:
1:从数组中随机取出一个数,作为基准元素。
2:分区:将比这个数大或等于的数全放到它的右边,小于它的数全放到它的左边(小到大排序时)
3:再对左右区间重复第二步,直到各区间只有一个数。
假设当前的待排序的序列为 R[low,hight] , 其中 low<=hight。同时选取首元素为基准元素。
步骤一:选取首元素的第一个元素作为基准元素 pivot=R[low] ,i=low ,j=hight。
步骤二:从右向左扫描,找到小于等于 pivot 的数,如果找到,R[i] 和 R[j] 交换 ,i++。
步骤三:从左向右扫描,找到大于 pivot 的数,如果找到,R[i] 和 R[j] 交换,j–。
步骤四:重复 步骤二~步骤三,直到 j 与 i 的指针重合 返回位置 mid=i ,该位置的数正好是 pivot 元素。
十.快速排序求最值。
代码:
#include <stdio.h>
#include
#include <math.h>
#include
#define MAXNUM 10000
using namespace std;
int part(int* r, int low, int hight)
{
int i = low, j = hight, pivot = r[low];
while (i < j)
{
while (i<j && r[j]>pivot) //从右向左开始找一个 小于等于 pivot的数值
{
j–;
}
if (i < j)
{
swap(r[i++], r[j]); //r[i]和r[j]交换后 i 向右移动一位
}
while (i < j && r[i] <= pivot) //从左向右开始找一个 大于 pivot的数值
{
i++;
}
if (i < j)
{
swap(r[i], r[j–]); //r[i]和r[j]交换后 i 向左移动一位
}
}
return i; //返回最终划分完成后基准元素所在的位置
}
void Quicksort(int* r, int low, int hight)
{
int mid;
if (low < hight)
{
mid = part(r, low, hight); // 重新规定基准元素
Quicksort(r, low, mid - 1); // 左区间递归
Quicksort(r, mid+1, hight); // 右区间递归
}
}
int main()
{
int a[MAXNUM];
int N;
cout << "请输入要排序的数据的个数: " << endl;
cin >> N;
cout << "请输入要排序的数据: " << endl;
for (int i = 0; i < N; i++)
{
cin >> a[i];
}
cout << endl;
Quicksort(a, 0, N - 1);
cout << "最小值为: " << “”;
cout << a[0] << endl;
cout << "最大值为: " << “”;
cout << a[N-1] << endl;
return 0;
}
结果:
十一.分治法求x的n次方。
分成1,奇数,偶数三种情况。
代码:
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
int plu(int X,int N){
if(N1) return X;
else if(N%20)
return plu(X,N/2)*plu(X,N/2);
else
return plu(X,(N+1)/2)*plu(X,(N-1)/2);
}
int main (){
int x,n;
cout<<“输入x:”<<“”;
cin>>x;
cout<<“输入n:”<<“”;
cin>>n;
cout<<“x的n次方为:”<<plu(x,n)<<endl;
return 0;
}
结果: