【递归二路划分 + 分割后的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 };