归并排序的C++代码实现
归并排序的C++代码实现
1.原理
分治法,没什么好说的。需要注意的是写代码的时候。只要默念:分治左、分治右,归并,就可以了。额外的空间开销是不可避免的。时间复杂度 O(n*log n)。基本是排序算法中最稳定和鲁棒的了。可以通过几乎所有的 OJ。
2.C++代码实现
#pragma warning (disable:4996)
#include<cstdio>
#include<Windows.h>
using namespace std;
//right可以被取到
void merge(int arr[], int left,int mid, int right) {
int *left_arr = new int[mid - left + 1];
for (int i = left, j = 0; i <= mid; ++i)
left_arr[j++] = arr[i];
int *right_arr = new int[right - mid];
for (int i = mid + 1, j = 0; i <= right; ++i)
right_arr[j++] = arr[i];
int left_index = 0, right_index = 0;
for (int i = left; i <= right; ++i) {
//根据判断条件,要么取左,要么取右。所以找到完全判断左的条件即可
if (left_index < mid - left + 1 &&
(left_arr[left_index] <= right_arr[right_index] || right_index >= right - mid)) {
arr[i] = left_arr[left_index++];
}
else
arr[i] = right_arr[right_index++];
}
}
void mergesort(int arr[],int left,int right) {
if (left >= right)
return;
else {
int mid = (left + right) / 2;
mergesort(arr,left, mid);
mergesort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
int main() {
int arr[] = { 7,8,6,4,5,4,3 };
int n = sizeof(arr) / sizeof(arr[0]);
mergesort(arr,0, n - 1);
for (int i = 0; i < n; ++i)
printf("%d ", arr[i]);
printf("\n");
system("pause");
return 0;
}

浙公网安备 33010602011771号