归并排序的基本思想是:
用一个8位的数组举例:
- 将待排序的数组一分为二直到只剩下一个元素
3 | 1 | 7 | 8 | 6 | 5 | 4 | 2 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3 | 1 | 7 | 8 | 6 | 5 | 4 | 2 | |||||||||
3 | 1 | 7 | 8 | 6 | 5 | 4 | 2 | |||||||||
3 | 1 | 7 | 8 | 6 | 5 | 4 | 2 |
- 将子集合合并
3 | 1 | 7 | 8 | 6 | 5 | 4 | 2 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 3 | 7 | 8 | 5 | 6 | 2 | 4 | ||||||||
1 | 3 | 7 | 8 | 2 | 4 | 5 | 6 | ||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
下面是c++语言编写的归并排序的核心代码
void Merge(int *arr, int left, int middle, int right) {
int *temp = new int [right-left+1];
/*
这里动态申请了一个辅助的数组temp
*/
int i = left;
int j = middle + 1;
int k = 0;
while (i <= middle && j <= right) {
if (arr[i] <= arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
}
while (i <= middle)
temp[k++] = arr[i++];
while (j <= right)
temp[k++] = arr[j++];
for (i = 0; i < k; i++)
arr[i + left] = temp[i];
delete[] temp;
}
void MergeSort(int *arr, int left, int right) {
if (left < right) {
int middle = (left + right) / 2;
MergeSort(arr, left, middle);
MergeSort(arr, middle + 1, right);
Merge(arr, left, middle, right);
}
}
如果你觉得这篇文章对你有帮助,点个赞吧~ pwp ~°