归并排序C++实现
步骤
- merge_sort
- sort_process
- merge
复杂度
O(nlogn)
过程
代码
#include <iostream>
void swap(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
void random_array(int *arr, unsigned int size, int max_value) {
for (unsigned int i = 0; i < size; ++i) {
arr[i] = rand() % max_value + 1;
}
}
//归并且排序
void merge(int *arr, unsigned int L, unsigned int mid, unsigned int R) {
unsigned int i = 0;
unsigned int help[R - L + 1];
unsigned int p1 = L;
unsigned int p2 = mid + 1;
//将两侧的数组临时放到help
while (p1 <= mid && p2 <= R) {
//谁小填谁,并移动
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
//p1,p2必有且只有一个越界
while (p1 <= mid) {
help[i++] = arr[p1++];
}
while (p2 <= R) {
help[i++] = arr[p2++];
}
//help拷贝回原数组
for (unsigned int i = 0; i < R - L + 1; ++i) {
arr[L + i] = help[i];
}
}
//分治
void sort_process(int *arr, unsigned int L, unsigned int R) {
if (L == R) {
return;
}
//防止加法溢出
int mid = L + ((R - L) >> 1);
//分治左侧
sort_process(arr, 0, mid);
//分治右侧
sort_process(arr, mid + 1, R);
//归并
merge(arr, L, mid, R);
}
//排序入口
void merge_sort(int *arr, unsigned int size) {
if (size < 2) {
return;
}
sort_process(arr, 0, size - 1);
}
int main(void)
{
int arr[10];
random_array(arr, 10, 100);
merge_sort(arr, 10);
for (unsigned int i = 0; i < 10; ++i) {
std::cout << arr[i] << std::endl;
}
return 0;
}