时间: 2020-06-20 22:51 //归并函数, 传入数组和数组的最左下标最右下标中间下标 void merge(int* arr, int left, int right, int mid){ int* tmp = new int[right - left + 1];//辅助数组 int L = left;//记录左边部分最左下标 int R = mid + 1;//记录右边部分最左下标 int M = mid;//记录中间下标 int k = 0;//辅助数组的开始下标 while(L <= mid && R <= right){//排序 if(arr[L] <= arr[R]){ tmp[k++] = arr[L++]; }else{ tmp[k++] = arr[R++]; } } while(L <= mid){//把中间节点左边剩余的元素继续加入辅助数组 tmp[k++] = arr[L++]; } while(R <= right){//把中间节点右边剩余的元素继续加入辅助数组 tmp[k++] = arr[R++]; } //把辅助数组中排好序的元素拷贝至原数组对应的位置 memcpy(arr + left, tmp, sizeof(int)*(right - left + 1)); delete tmp;//释放内存 } void mySort(int* arr, int left, int right, int mid){ if(left >= right){//若只有一个元素则 return return; } //对左部分递归 mySort(arr, left, mid, left + ((mid - left) >> 1)); //对右部分递归 mySort(arr, mid + 1, right, mid + 1 + ((right - mid -1) >> 1)); merge(arr, left, right, mid);//排序 }