原理:
归并排序是建立在归并操作上的一种排序算法,将两个(或两个以上)的有序表合成一个新的有序表,即把待排序列分为若干个子序列,每个子序列都是有序的。然后再把有序子序列合并为新的整体有序序列。
归并算法的核心:
先分解,再合并。
如何让数组内的数据有序?
可以将A、B两组数据内部再进行数据分组,直到每个小组只有一个数据,可以认为小组组内的数据已经达到了有序,然后再合并相邻的两个小组。这样通过递归的分解数列,可以使 A 、B两个组内数据达到有序,然后再合并 A、 B两组数据。这样就完成了归并排序。
代码:
void
mergeSortSelector(
int
arr[],
int
first,
int
end,
int
temp[])
{
if (first < end) {
int mid = (first + end) / 2 ;
mergeSortSelector (arr,first,mid,temp);
mergeSortSelector (arr, mid + 1 , end,temp);
mergeSortArray (arr, first, mid, end,temp);
}
}
void mergeSortArray ( int arr[], int first, int mid, int end, int temp[])
{
int i = first,j = mid + 1 ,k = 0 ;
int m = mid ,n = end;
while (i <= m && j <= n) {
if (arr[i] >= arr[j]) {
temp[k] = arr[j];
j ++;
k ++;
}
else
{
temp[k] = arr[i];
k ++;
i ++;
}
}
while (i <= m) {
temp[k] = arr[i];
k ++;
i ++;
}
while (j <= n) {
temp[k] = arr[j];
k ++;
j ++;
}
for (i = 0 ; i < k; i ++) {
arr[first + i] = temp[i];
{
if (first < end) {
int mid = (first + end) / 2 ;
mergeSortSelector (arr,first,mid,temp);
mergeSortSelector (arr, mid + 1 , end,temp);
mergeSortArray (arr, first, mid, end,temp);
}
}
void mergeSortArray ( int arr[], int first, int mid, int end, int temp[])
{
int i = first,j = mid + 1 ,k = 0 ;
int m = mid ,n = end;
while (i <= m && j <= n) {
if (arr[i] >= arr[j]) {
temp[k] = arr[j];
j ++;
k ++;
}
else
{
temp[k] = arr[i];
k ++;
i ++;
}
}
while (i <= m) {
temp[k] = arr[i];
k ++;
i ++;
}
while (j <= n) {
temp[k] = arr[j];
k ++;
j ++;
}
for (i = 0 ; i < k; i ++) {
arr[first + i] = temp[i];
}
}
为了达到最大效率的排序,临时数组 temp 只new 了一次,即只占用了一块内存,避免了多次生成temp ,分配内存造成的时间浪费。