#include <iostream>
#include <cstdlib>
using namespace std;
void print_Arr(int arr[],int n){
for (int i = 0; i < n; i++) {
cout << arr[i] << " " ;
}
cout << endl;
}
void merge(int arr[],int tempArr[],int left,int mid,int right){
//左侧第一个未排序的元素下标
int l_pos = left;
//右侧第一个未排序的元素下标
int r_pos = mid+1;
//临时数组下标开始的位置
int pos = left;
//当左右元素都不唯一时的合并
while(l_pos <= mid && r_pos <= right){
if (arr[l_pos] > arr[r_pos]){
tempArr[pos++] = arr[r_pos++];
} else{
tempArr[pos++] = arr[l_pos++];
}
}
//当右侧元素都进入数组了,只合并左侧数组
while(l_pos<=mid){
tempArr[pos++] = arr[l_pos++];
}
//当左侧元素都进入数组了,只合并右侧数组
while(r_pos<=right){
tempArr[pos++] = arr[r_pos++];
}
//将辅助数组中的元素赋值给arr
while (left<=right){
arr[left] = tempArr[left];
left++;
}
}
void mSort(int arr[],int tempArr[],int left,int right){
if (left < right){
int mid = (left + right)/2;
//用left和mid将数组分为最小单位,不能再被分割,即left=right时
//返回,此时再将两个最小的单位归并,变成一个单位,完成merge(),
//返回上一步,和另一个返回来的单位(另一个msort完成merge后)
//共同归并
mSort(arr,tempArr,left,mid);
mSort(arr,tempArr,mid+1,right);
merge(arr,tempArr,left,mid,right);
}
}
void merge_sort(int arr[],int n){
//分配辅助数组
int* temp = (int*) malloc(n * sizeof (int));
if (temp){
//传进去此数组的left和right
mSort(arr,temp,0,n-1);
free(temp);
} else {
cout << "error to allocate memory" << endl;
}
}
int main(){
int arr[8]={4,1,2,7,3,8,7,9};
print_Arr(arr,8);
merge_sort(arr,8);
print_Arr(arr,8);
return 0;
}
该说不说,确实难,对于我来说。
首先定义数组——遍历——定义暂时空间储存元素——对数组进行分治,分治到最小单位——归并——复制元素进原数组
具体的我对这个排序的理解都已经放在注释里了,至少今晚上我还对这个方法很熟,明天,那就是明天的事了,哈哈。
具体还是参考那位up的视频。