归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个典型的应用。它的基本操作是:将已有的子序列合并,达到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
1.分解—-将序列每次折半拆分
2.合并—-将划分后的序列段两两排序合并
合并思路
设置为序列A,与序列B,
3 4 7 9
2 6 8
设置两个位置指示器,分别指向序列A与序列B开始的位置:红色为指示器指向位置:
3 4 7 9
2 6 8
形成的序列C:已经被插入一个元素了,刚才较小的 元素2.
2
然后 再次 比较序列A与序列B中指示器所指向的元素:将小的放入到序列C中,移动相应指针,结果为:
3 4 7 9
2 6 8
2 3
以此类推,迭代执行,直到序列A或者序列B中某个指示器已经移到到数组末端。
2 3 4 6 7 8
java
public static void merge(int[] array, int low, int middle, int high) {
int[] temp = new int[high - low + 1];
int i = low;
int j = middle + 1;
int k = 0;
while (i <= middle && j <= high) {
if (array[i] < array[j]) {
temp[k++] = array[i++];
} else {
temp[k++] = array[j++];
}
}
while (i <= middle) {
temp[k++] = array[i++];
}
while (j <= high) {
temp[k++] = array[j++];
}
for (int m = 0; m < temp.length; m++) {
array[m + low] = temp[m];
}
}
php
function mergeSort(&$arr, $low, $high) {
if ($low < $high) {
$mid = intval(($low + $high) / 2);
mergeSort($arr, $low, $mid);
mergeSort($arr, $mid + 1, $high);
merge($arr, $low, $high, $mid);
}
}
//归并排序
function merge(&$arr, $low, $high, $mid) {
$minLow = $low;
$maxHigh = $mid + 1;
while ($minLow <= $mid && $maxHigh <= $high) {
if ($arr[$minLow] <= $arr[$maxHigh]) {
$temp[] = $arr[$minLow];
$minLow++;
} else {
$temp[] = $arr[$maxHigh];
$maxHigh++;
}
}
while ($minLow <= $mid) {
$temp[] = $arr[$minLow++];
}
while ($maxHigh <= $high) {
$temp[] = $arr[$maxHigh++];
}
$length = count($temp);
for ($i = 0; $i < $length; $i++) {
$arr[$i + $low] = $temp[$i];
}
}