归并排序

来源:互联网 发布:cms node.js 编辑:程序博客网 时间:2024/05/14 08:18

递归版

template <class T>void merge(T *a, T *b, int left, int mid, int right){int i = left, j = mid + 1, k = left;while (i <= mid && j <= right){if (a[i] > a[j])b[k++] = a[j++];elseb[k++] = a[i++];}if (i > mid)while (j <= right)b[k++] = a[j++];elsewhile (i <= mid)b[k++] = a[i++];while (left <= right)a[left] = b[left++];}template <class T>void mergeSort(T *a, T *b, int left, int right){if (left < right){int mid = (left + right) / 2;mergeSort(a, b, left, mid);mergeSort(a, b, mid + 1, right);merge(a, b, left, mid, right);}}

非递归版,a与b相互归并省去b向a赋值部分


template <class T>void merge(T *a, T *b, int left, int mid, int right){int i = left, j = mid + 1, k = left;while (i <= mid && j <= right){if (a[i] > a[j])b[k++] = a[j++];elseb[k++] = a[i++];}if (i > mid)while (j <= right)b[k++] = a[j++];elsewhile (i <= mid)b[k++] = a[i++];//while (left <= right)//a[left] = b[left++];}template<class T>void mergePass(T *a, T *b, int n, int segmentSize){int i = 0;while (i <= n - 2 * segmentSize){merge(a, b, i, i + segmentSize - 1, i + 2 * segmentSize - 1);i = i + 2 * segmentSize;}if (i + segmentSize < n)merge(a, b, i, i + segmentSize - 1, n - 1);elsefor (int j = i; j < n; j++)b[j] = a[j];}template<class T>void mergeSort(T *a, int n){T *b = new T[n];int segmentSize = 1;while (segmentSize < n){mergePass(a, b, n, segmentSize);segmentSize *= 2;mergePass(b, a, n, segmentSize);segmentSize *= 2;}delete[] b;}


0 0
原创粉丝点击