// 这里递归实现 分解
void merge_sort(int * arr, int p, int q){
if(arr == NULL || p == q){
return;
}
int mid = (p + q)/2;
merge_sort(arr,p,mid);
merge_sort(arr,mid+1,q);
merge(arr,p,mid,q);
}
这里实现的是,两个有序数组,合并的问题
tempLeft 存放左边数据
tempRight 存放右边数据
void merge(int *arr,int left,int mid,int right){
// 定义临时数组,用于存放
int tempLeft[mid - left + 1 +1]; // 数组大小 比 要存的数目 大 1
int tempRight[right - mid + 1];
for(int i = 0;i < mid - left + 1;i++){
tempLeft[i] = arr[left + i];
}
tempLeft[sizeof(tempLeft)/sizeof(tempLeft[0]) - 1] = 2467; // 尾部存一个较大值 , 处理合并比较时, 数组越界问题
for(int i = 0;i < right - mid;i++){
tempRight[i] = arr[mid + 1 + i];
}
tempRight[sizeof(tempRight)/sizeof(tempRight[0]) - 1] = 2467; // 尾部存一个较大值 , 处理合并比较时, 数组越界问题
// 逐一比较, 合并两有序数组
int i = 0,j = 0;
for(int k = left;k <= right;k++){
if(tempLeft[i] <= tempRight[j]){
arr[k] = tempLeft[i];
i++;
}else{
arr[k] = tempRight[j];
j++;
}
}
}