递归时间复杂度(master),时间复杂度为O(NlogN)的排序
归并排序:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
void merge(int arr[], int L, int R, int mid)
{
int* help = new int[R - L + 1];
int i = 0;
int p1 = L;
int p2 = mid + 1;
while (p1 <= mid && p2 <= R)
{
help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= mid)
{
help[i++] = arr[p1++];
}
while (p2 <= R)
{
help[i++] = arr[p2++];
}
for (int j = 0;j < i;j++)
{
arr[L + j] = help[j];
}
delete[] help;
}
void Process(int arr[],int L,int R)
{
if (L == R)
{
return;
}
int mid = L + ((R - L) >> 1);
Process(arr, L, mid);
Process(arr, mid + 1, R);
merge(arr, L, R, mid);
}
int main()
{
int arr[] = { 11,3,5,9,9,26,113 };
int len = sizeof(arr) / sizeof(arr[0]);
Process(arr, 0, len-1);
for (int i = 0;i < len;i++)
{
cout << arr[i] << " ";
}
return 0;
}
小和问题:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int merge(int arr[], int L, int R, int mid)
{
int* help = new int[R - L + 1];
int i = 0;
int p1 = L;
int p2 = mid + 1;
int sort = 0;
while (p1 <= mid && p2 <= R)
{
sort += arr[p1] < arr[p2] ? (R - p2 + 1) * arr[p1] : 0;
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= mid)
{
help[i++] = arr[p1++];
}
while (p2 <= R)
{
help[i++] = arr[p2++];
}
for (int j = 0;j < i;j++)
{
arr[L + j] = help[j];
}
delete[] help;
return sort;
}
int Process(int arr[],int L,int R)
{
if (L == R)
{
return 0;
}
int mid = L + ((R - L) >> 1);
return
Process(arr, L, mid)+
Process(arr, mid + 1, R)+
merge(arr, L, R, mid);
}
int main()
{
int arr[] = { 11,3,5,9,9,26,113 };
int len = sizeof(arr) / sizeof(arr[0]);
cout << Process(arr, 0, len - 1) << endl;
for (int i = 0;i < len;i++)
{
cout << arr[i] << " ";
}
return 0;
}
逆序对问题:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int merge(int arr[], int L, int R, int mid)
{
int* help = new int[R - L + 1];
int i = 0;
int p1 = L;
int p2 = mid + 1;
int sort = 0;
while (p1 <= mid && p2 <= R)
{
sort += arr[p2] < arr[p1] ? (p1 - L + 1) : 0;
int j = 0;
while (arr[p2] < arr[p1] && j + p1 < p2)
{
cout << arr[p1 + (j++)] << " : " << arr[p2] << endl;
}
help[i++] = arr[p2] < arr[p1] ? arr[p2++] : arr[p1++];
}
while (p1 <= mid)
{
help[i++] = arr[p1++];
}
while (p2 <= R)
{
help[i++] = arr[p2++];
}
for (int j = 0;j < i;j++)
{
arr[L + j] = help[j];
}
delete[] help;
return sort;
}
int Process(int arr[], int L, int R)
{
if (L == R)
{
return 0;
}
int mid = L + ((R - L) >> 1);
return
Process(arr, L, mid) +
Process(arr, mid + 1, R) +
merge(arr, L, R, mid);
}
int main()
{
int arr[] = { 1,3,4,2,5 };
int len = sizeof(arr) / sizeof(arr[0]);
cout << Process(arr, 0, len - 1) << endl;
for (int i = 0;i < len;i++)
{
cout << arr[i] << " ";
}
return 0;
}
荷兰国旗问题:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
void swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
void Sort(int arr[], int len)
{
int p1 = -1;
int p2 = len;
int i = 0;
int num = arr[len - 1];
while (i < p2)
{
if (arr[i] < num)
{
swap(arr[i++], arr[++p1]);
}
else if (arr[i] > num)
{
swap(arr[i], arr[--p2]);
}
else
{
i++;
}
}
}
int main()
{
int arr[] = { 1,3,4,2,5,3,2,1,4,5,7,5,5 };
int len = sizeof(arr) / sizeof(arr[0]);
Sort(arr, len);
for (int i = 0;i < len;i++)
{
cout << arr[i] << " ";
}
return 0;
}