1.归并排序算法
归并排序,用到了分治思想,实现的时候用到递归算法。将整个大的数组的排序不断地分为两个小的数组的排序然后进行合并。
2.算法实现
采用递归
// created by YunaLin
// 2017-09-14
// mergeSort, using divide and conquer algorithm, resursion
#include <iostream>
using namespace std;
const int MAX = 1000;
int temp[MAX];
void mergeSort(int* array, int min, int max);
void combineSub(int* array, int min, int mid, int max);
int main() {
int n;
cout << "the length of the array you want to sort: ";
cin >> n;
int array[MAX];
for (int i = 0; i < n; ++i) {
cin >> array[i];
}
mergeSort(array, 0, n - 1);
for (int i = 0; i < n; ++i) {
cout << array[i] << " ";
}
cout << endl;
return 0;
}
void mergeSort(int* array, int min, int max) {
// 注意结束条件的判断
if (min >= max) return;
int mid = (min + max)/2;
// 递归,时间复杂度为O(nlogn)
mergeSort(array, min, mid);
mergeSort(array, mid + 1, max);
combineSub(array, min, mid, max);
}
void combineSub(int* array, int min, int mid, int max) {
// 因为两个子数组已经是排序了的,所以只需要不断地比较第一个数,
// 然后往后移动直到将所有的数字放到一个总的数组里面即可
int i = min, j = mid + 1, index = min;
while (i <= mid && j <= max) {
if (array[i] < array[j]) {
temp[index++] = array[i++];
} else if (array[i] > array[j]) {
temp[index++] = array[j++];
} else {
temp[index++] = array[i++];
temp[index++] = array[j++];
}
}
while (i <= mid) {
temp[index++] = array[i++];
}
while (j <= max) {
temp[index++] = array[j++];
}
for (int i = min; i <= max; ++i) {
array[i] = temp[i];
}
}
3.时间复杂度
T(n)=2T(n/2) +O(n)
总的运行时间是O(nlogn).