归并排序

来源:互联网 发布:sql promp8破解 编辑:程序博客网 时间:2024/06/14 11:07

  归并排序的思想是分治法。先进行划分,然后对划分得到的部分分别排序进行递归继续划分,最后达到条件后退出递归,逐层合并。
  一方面在进行划分时,划分的重点的计算为了防止数据的溢出,不要采用m=(x+y)/2而应当采用m=x+(y-x)/2的方式。
  主要需要注意的地方在于合并时的条件,在进行合并时,只要两个部分中有一个部分为空即可进行复制到暂存数组,如果都不为空,则要判断大小看是将左边部分还要右边部分复制到暂存数组。
代码如下:

#include <iostream>#include <string>using namespace std;#define Maxn 100int temp[Maxn] = { 0 };int A[Maxn] = { 9, 4, 5, 3, 2, 1, 8, 4, 10, 52, 15, 66 };void merge_sort(int *T, int x, int y, int *Temp_Arr){    //注意以后对于这种划分的操作都采用左开右闭的形式[x,y),这样方便自己思考,所以这里的条件是y-x>1    //另外二分的时候采用m = x+(y-x)/2的形式,避免直接x+y时数据溢出    if (y - x > 1)    {        int m = x + (y - x) / 2;        merge_sort(T, x, m, Temp_Arr);        merge_sort(T, m, y, Temp_Arr);        int p = x, q = m, k = x;//这里pq的意义是个易错点,主要是为了后面找A中的值赋给暂存数组用的,不要想错了        while (p < m || q < y)        {            //比较左右两侧的数据谁大谁小,小的入暂存数组            if (p < m&&T[p] <= T[q] || q >= y)Temp_Arr[k++] = T[p++];            else Temp_Arr[k++] = T[q++];        }        for (int i = x; i < y; i++)            T[i] = Temp_Arr[i];    }}int main(){    merge_sort(A, 0, 8, temp);    return 0;}
原创粉丝点击