一、关于分治策略
分治策略: 简单来说就是将问题的规模变小,问题本身不变
解题步骤:
- 分解: 将原问题划分成子问题,规模变小
- 递归: 递归求解子问题,若子问题规模足够小,此时停止递归,直接求解
- 合并: 将小规模的解合并成原规模的解
注意: 分治策略是一种处理问题的思想,递归是一种算法。
二、使用分治策略+递归解题
(1)快速排序
#include<iostream>
#include<stack>
#include<limits.h>
using namespace std;
//快排
#if 1
class QuickSort
{
public:
//从左向右划分(适用于单链表)
void LeftToRight(int* arr, int left, int right)
{
int j = left - 1;
int i = left;
int tmp = arr[left];
while (i <= right)
{
if (arr[i] <= tmp)
{
++j;
swap(arr[i], arr[j]);
}
++i;
}
swap(arr[left], arr[j]);
if (left < j - 1)
{
LeftToRight(arr, left, j - 1);
}
if (j + 1 < right)
{
LeftToRight(arr, j + 1, right);
}
}
private:
//两边向中间划分
int OnePartition(int* arr, int left, int right)
{
int tmp = arr[left];
int i = left;
int j = right;
while (i < j)
{
while (i < j && arr[j] > tmp)
{
--j;
}
arr[i] = arr[j];
while (i < j && arr[i] <= tmp)
{
++i;
}
arr[j] = arr[i];
}
arr[i] = tmp;
return i;
}
public:
//递归快排
void qu