归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
归并排序算法的核心正是 Day 19 的合并两个有序数组,补全如下代码:
def merge_sort(lst):
#
#
#
return lst_sorted
归并排序两阶段:
先分,直到长度1,然后再合:
#include <iostream>
using namespace std;
//merge two subarrays L and M into arr
void merge(int arr[], int p,int q, int r)
{
//create L<- A[p..q] and M<-A[q+1..r]
int n1 = q-p+1;
int n2 = r-q;
int L[n1],M[n2] ;
for(int i = 0;i<n1;i++)
L[i] = arr[p+i];
for(int j =0;j<n2;j++)
M[j] = arr[q+1+j];
//
int i,j,k;
i =0;
j =0;
k =p;
while(i<n1 &&j<n2){
if(L[i]<=M[j])
{
arr[k] = L[i];
i++;
}else{
arr[k] = M[j];
j++;
}
k++;
}
// When we run out of elements in either L or M,
// pick up the remaining elements and put in A[p..r]
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = M[j];
j++;
k++;
}
}
// Divide the array into two subarrays, sort them and merge them
void mergeSort(int arr[], int l, int r){
if (l < r) {
// m is the point where the array is divided into two subarrays
int m = l + (r - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
// Merge the sorted subarrays
merge(arr, l, m, r);
}
}
// Print the array
void printArray(int arr[], int size)
{
for (int i = 0; i < size; i++)
cout << arr[i] << " ";
cout << endl;
}
int main() {
int arr[] = {6, 5, 12, 10, 9, 1};
int size = sizeof(arr) / sizeof(arr[0]);
mergeSort(arr, 0, size - 1);
cout << "Sorted array: \n";
printArray(arr, size);
return 0;
}