【每日算法】归并排序

来源:互联网 发布:两组数据t检验 编辑:程序博客网 时间:2024/06/07 10:17

思路:

1、分解:将n个元素分成各含n/2个元素的子序列; 

2、解决:用归并排序法对两个子序列递归地排序; 

3、合并:合并两个已排序的子序列以得到排序结果。

归并排序的时间复杂度为O(n logn),空间复杂度为O(n)。归并排序是稳定的

代码:

void  mergesort(int arr[], int l, int r){if (arr == NULL || l >= r)return;int m = (l + r) / 2;mergesort(arr, l, m);mergesort(arr, m, r);merge(arr, l, m, r);}void merge(int arr[], int l, int m,int r){int index_l = l, index_r = m + 1;int index_tmp = 0;int *tmp = new int[r - l + 1];while (index_l <=m&&index_r <= r){if (arr[index_l] <= arr[index_r])tmp[index_tmp++] = arr[index_l++];elsetmp[index_tmp++] = arr[index_r++];}while (index_l<=m)tmp[index_tmp++] = arr[index_l++];while (index_r<=r)tmp[index_tmp++] = arr[index_r++];for (int i = 0; i <= index_tmp; i++){arr[i] = tmp[i];}delete[] tmp;}
举例:剑指offer中的《数组中的逆序对》、合并两个有序链表

原创粉丝点击