void mergearray (int arr[] , int first , int mid , int last , int temp[]) {
// temp数组是临时用来储存已经排好序的数组int i = first , j = mid + 1 ;
// i , j分别储存两个数组两部分的开头int m = mid , n = last ;
// m储存中间值,i部分的末尾;n储存末尾值,j部分的末尾int k = 0 ;
// 储存temp数组的的位置 while (i <= m && j <= n) { // 两部分数组都未遍历完的时候if (arr[i] <= arr[j])
temp[k ++] = arr[i ++] ;
elseif (arr[i] > arr[j])
temp[k ++] = arr[j ++] ;
}
// i , j两部分数组至少有一个已经遍历完,如果遍历完,就不会进入while循环 while (i <= m) // 如果i部分数组还未遍历完
temp[k ++] = arr[i ++] ;
while (j <= n) // 如果j部分数组还未遍历完
temp[k ++] = arr[j ++] ;
for (int i = 0 ; i < k ; i ++)
arr[first + i] = temp[i] ;
// 将排好序的数组复制回原数组,因为temp数组是临时的
}
Step2: 将数组一分为二,不断递归
void mergesort (int arr[] , int first , int last , int temp[]) {
if (first == last) return ;
// 只有一个元素的时候,就是已经排好序的,直接返回if (first < last) {
int mid = (first + last) / 2 ;
// 找到中间点
mergesort (arr , first , mid , temp) ;
// 对左边排好序
mergesort (arr , mid + 1 , last , temp) ;
// 对右边排好序
mergearray (arr , first , mid , last , temp) ;
// 将左边,右边合并进入一个数组
}
}