归并排序
Posted 我是一个小木匠!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序相关的知识,希望对你有一定的参考价值。
/* * 归并排序是稳定的 最好 最坏 平均情况时间复杂度都为O(log n) 空间复杂度为O(n) 在外排序中有着很好的应用。 * 下面这个是递归的版本 */ #include "iostream" using namespace std; void merge(int a[],int temp[],int left,int right,int rightEnd) { /* 合并2个有序的子序列 */ int l = left; int leftEnd = right - 1; int len = rightEnd - left + 1; while (left <= leftEnd && right <= rightEnd) { if (a[left] <= a[right]) { temp[l] = a[left]; left++; } else { temp[l] = a[right]; right++; } l++; } while (left <= leftEnd) temp[l++] = a[left++]; while (right <= rightEnd) temp[l++] = a[right++]; /* 将temp中的元素复制回a数组 */ for (int i = rightEnd; len>0; i--,len--) { a[i] = temp[i]; } } void MSort(int a[],int temp[],int left,int right) { if (left < right) { int mid = (left + right) / 2; MSort(a, temp, left, mid); MSort(a, temp, mid + 1, right); merge(a, temp, left, mid + 1, right); } } void merge_sort(int a[],int n) { int* temp = (int*)malloc(n*sizeof(int)); if (temp != NULL) { MSort(a, temp, 0, n - 1); free(temp); } else { cout << "内存不足" << endl; } } void print(int a[]) { for (int i = 0; i < 10; i++) cout << a[i] << " "; cout << endl; } int main() { int a[10] = { 3,5,7,4,2,1,0,8,9,6 }; merge_sort(a, 10); print(a); }
/* * 归并排序 最好 最坏 平均情况时间复杂度都为O(log n) 空间复杂度为O(n) 在外排序中有着很好的应用。 * 下面这个是非递归的版本 */ #include "iostream" using namespace std; void merge(int a[],int temp[],int left,int right,int rightEnd) { /* 合并2个有序的子序列 */ int l = left; int leftEnd = right - 1; int len = rightEnd - left + 1; while (left <= leftEnd && right <= rightEnd) { if (a[left] <= a[right]) { temp[l] = a[left]; left++; } else { temp[l] = a[right]; right++; } l++; } while (left <= leftEnd) temp[l++] = a[left++]; while (right <= rightEnd) temp[l++] = a[right++]; } /* 一趟2路归并 */ void MergePass(int a[],int temp[],int n,int length) { /* length:当前有序子列的长度 */ int i; for (i = 0; i <= n - 2 * length; i+=2*length) { merge(a,temp,i,i+length,i+2*length-1); } if (i + length < n) merge(a, temp, i, i + length, n - 1); else for (int j = i; j < n; j++) temp[j] = a[j]; } void merge_sort(int a[],int n) { int* temp = (int*)malloc(n*sizeof(int)); int length = 1; if (temp != NULL) { while (length < n){ MergePass(a, temp, n, length); length *= 2; MergePass(temp, a, n, length); length *= 2; } free(temp); } else { cout << "内存不足" << endl; } } void print(int a[]) { for (int i = 0; i < 10; i++) cout << a[i] << " "; cout << endl; } int main() { int a[10] = { 3,5,7,4,2,1,0,8,9,6 }; merge_sort(a, 10); print(a); }
以上是关于归并排序的主要内容,如果未能解决你的问题,请参考以下文章