二路-归并排序归纳

来源:互联网 发布:k算法求最小生成树 编辑:程序博客网 时间:2024/06/01 20:50

【递归二路划分 + 分割后的2个数组归并】

//归并排序:递归二路划分+归并思想==二路,归并排序//函数的参数列表是:a,l,r;这是每次需要循环递归的初始条件 :数组(操作对象),两个端点//不需要初始化端点,端点由函数传入    //1、二分+ 2.两个左右两边的倒叙递归;由里向外void Two_divide_Merge_Sort(int a[],int left ,int right){        if (left < right)    {        int mid = (left + right) / 2;        Two_divide_Merge_Sort(a,left,mid);//左边部分二分。   递归1的从内到外        Two_divide_Merge_Sort(a, mid + 1, right); //右边部分二分。   递归2的从内到外        //下面是函数的最小单元的操作了:归并、        //对已经分成的两段数组,进行归并排序        merge1(a, left, mid, mid + 1, right);                       //循环体    }}===============下面是归并子函数================//一个数组,分成两段,有2对首尾端点.归并+合并到原来的数组void merge1(int a[],int l1 ,int r1,int l2,int r2){    //由函数参数列表已经把数字分成了两个数组    int i = l1, j = l2;//初始化指针    int temp[1001] = { 0 }; int index = 0;    while (i<= r1 && j <= r2){ //注意是可以取到等号的 因为是从l1开始的        if (a[i] <= a[j]) //注意是可以取到等号,两个元素可以相等        {            temp[index++] = a[i];            i++;        }        else{            temp[index++] = a[j++];        }    }    while (i <= r1){        temp[index++] = a[i];        i++;    }    while (j <= r2){        temp[index++] = a[j];        j++;    }    //2、合并到传入参数的数组中    for (int i = 0; i < index; i++)    {        a[l1 + i] = temp[i];    }}int a[8] = { 7, 3, 4, 1, 5, 4, 6, 9 };
0 0
原创粉丝点击