归并算法
归并算法的核心思想是分治思想。分治,分之治之。
对一个无须待排序列,分为有序的子序列,再将这些有序的子序列按合并为一个有序的序列。
归并排序流程:
- 申请一段和待排序列大小相同的空间,用来存放合并出来的有序序列
- 申请两个指针,分别指向已经有序的子序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复第三部操作直至有子序列中的值已经全部添加到合并序列中
- 将另一序列中的元素添加到合并序列
void Merge(int arr[], int ind[], int str, int mid, int end){
int new_str = mid + 1;
int i = str;
while (str != mid + 1 && new_str != end + 1){
if (arr[str] <= arr[new_str])
ind[i] = arr[str++];
else
ind[i] = arr[new_str++];
i++;
}
while (str != mid + 1)
ind[i++] = arr[str++];
while (new_str != end + 1)
ind[i++] = arr[new_str++];
for (int j = str; j <= end; j++)
arr[j] = ind[j];
}
void MergeSort(int arr[], int ind[], int str, int end){
if (str < end){
int mid = (str + end) / 2;
MergeSort(arr, ind, str, mid);
MergeSort(arr, ind, mid + 1, end);
//arr已经分为了两个有序的子序列
Merge(arr, ind, str, mid, end);
}
}
总结:
时间复杂度:O(N*logN)
稳定型:稳定