归并排序的本质是进行分治排序,然后再进行合并,从而实现总体数组的有序排列,时间复杂度为O(N*logN)。
将数组不断二分排序,然后每组之间进行元素大小的对比,从而形成新的有序数组,即先进行递归,再排序。左侧有序,右侧有序,然后排序让整个数组有序。
#includeusing namespace std; class Solution { public: Solution() { int a[10] = { 1,4,2,5,3,8,10,9,7,6 }; Mergesort(a, 0, 9); for (int i = 0; i < 10; i++) { cout << a[i] << " "; } } void Mergesort(int arr[], int l, int r) { if (l == r) { return; } int mid = l + (r - l) / 2; Mergesort(arr, l, mid); //左侧排好序 Mergesort(arr, mid + 1, r); //右侧排好序 Merge(arr, l, mid, r); //排序 } void Merge(int arr[], int l, int mid, int r) { int *help = new int[r - l + 1]; //开辟一个新的数组空间O(N) int i = 0; int p1 = l; //左侧的指针 int p2 = mid + 1; //右侧的指针 while (p1 <= mid && p2 <= r) //数组的左侧和右侧的元素不断进行对比,较小的元素赋值进数组 { help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++]; } while (p2 <= r) //将两侧剩余的较大的元素全部赋值进去 { help[i++] = arr[p2++]; } while (p1<=mid) //和上一个while循环一样,这两个while循环只能发生一个 { help[i++] = arr[p1++]; } for (int i = 0; i < r-l+1; i++) //将help数组赋值给arr数组 { arr[l + i] = help[i]; } delete []help; //c++需要手动删除,进行内存管理 } }; int main() { Solution solution; system("pause"); return 0; }



