经典排序算法之归并排序(Merge Sort)
归并算法定义:所谓归并排序是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)。
这样的排序方法经常用于多个有序的数据文件归并成一个有序的数据文件。
归并排序相比较之前的排序算法而言加入了分治法的思想,其算法思路如下:
1.如果给的数组只有一个元素的话,直接返回(也就是递归到最底层的一个情况)
2.把整个数组分为尽可能相等的两个部分(分)
3.对于两个被分开的两个部分进行整个归并排序(治)
4.把两个被分开且排好序的数组拼接在一起
代码演示如下:
void merge(int arr[], int l, int m, int r)
{ int i, j, k; int n1 = m - l + 1; int n2 = r - m; int L[n1], R[n2]; for (i = 0; i < n1; i++) L[i] = arr[l + i]; for (j = 0; j < n2; j++) R[j] = arr[m + 1+ j]; i = 0; j = 0; k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else{ arr[k] = R[j]; j++; } k++; } while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; }
} void mergeSort(int arr[], int l, int r)
{ if (l < r) { int m = l+(r-l)/2; mergeSort(arr, l, m); mergeSort(arr, m+1, r); merge(arr, l, m, r); }
}