递归
例1:矩阵的幂
例2:矩阵的前m次和
分治
例1 归并排序
code
#include<stdio.h>
const int maxn=1000001;
int A[maxn];
void merge(int arr[], int left, int middle, int right){
int i, j;
int n1=middle-left+1, n2=right-middle;
int L[n1], R[n2];
for(i=0;i<n1;i++) L[i]=arr[left+i];
for(j=0;j<n2;j++) R[j]=arr[middle+1+j];
i=j=0;
int k=left;
while(i<n1 && j<n2)
if(L[i]<=R[j]) arr[k++] = L[i++];
else arr[k++] = R[j++];
while (i<n1) arr[k++] = L[i++];
while (j<n2) arr[k++] = R[j++];
}
void mergesort(int arr[],int left, int right){
if(left<right){
int middle=(left+ right)/2;
mergesort(arr, left, middle);
mergesort(arr, middle+1,right);
merge(arr, left, middle, right);
}
}
int main() {
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d", &A[i]);
mergesort(A,0,n-1);
for(int i=0;i<n;i++) printf("%d ", A[i]);
}
例2:逆序对计数
快速排序
code
#include <stdio.h>
#pragma comment(linker, "/STACK:1073741824")
const int maxn=1000001;
int A[maxn];
void swap(int &a, int &b) {
int c = a; a = b; b = c;
}
int partition(int arr[], int low, int high) {
int pivot = arr[high], i = low;
for (int j = low; j < high; j++) {
if (arr[j] <= pivot){
swap(arr[i], arr[j]); i++;
}
}
swap(arr[i], arr[high]);
return i;
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int k = partition(arr, low, high);
quickSort(arr, low, k-1);
quickSort(arr, k+1, high);
}
}
int main() {
int n;
scanf( "%d", &n);
for (int i=0; i<n; i++) scanf("%d", &A[i]);
quickSort(A, 0, n-1);
for (int i=0; i<n; i++) printf("%d ", A[i]);
return 0;
}
复杂度分析
Random quicksort
#include <stdio.h>
#include <stdlib.h>
#pragma comment(linker, "/STACK:1073741824")
const int maxn=1000001;
int A[maxn];
void swap(int &a, int &b) {
int c = a; a = b; b = c;
}
int bigrand(){
int x = rand() % 1000;
int y = rand() % 1000;
return x * 1000 + y;
}
int partition(int arr[], int low, int high) {
swap(arr[low + bigrand() % (high - low + 1)], arr[high]);
int pivot = arr[high], i = low;
for (int j = low; j < high; j++) {
if (arr[j] <= pivot){
swap(arr[i], arr[j]); i++;
}
}
swap(arr[i], arr[high]);
return i;
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int k = partition(arr, low, high);
quickSort(arr, low, k-1);
quickSort(arr, k+1, high);
}
}
int main() {
srand(925);
int n;
scanf( "%d", &n);
for (int i=0; i<n; i++) scanf("%d", &A[i]);
quickSort(A, 0, n-1);
for (int i=0; i<n; i++) printf("%d ", A[i]);
return 0;
}
selection 问题
例3:最近点对