归并排序
2016-10-05 12:04
113 查看
归并排序------稳定
注:一个无序的数组用归并排序分治法,分成俩个有序的数组,然后进行比较合并为一个有序的数组
时间复杂度:O(NlogN);
空间复杂度:O(N);
<span style="font-size:18px;">//直接插入排序 void InsertSort(int* arr,int len) { if (arr == NULL && len <= 0) return; for (int i = 0; i < len - 1; ++i) { int end = i; int cur = arr[end + 1]; //待插入的数据 // 挪动数据 while (end >= 0 && arr[end] > cur) { arr[end + 1] = arr[end]; --end; } arr[end + 1] = cur; } } void MergeSort(int* src, int* dst,int left, int mid, int right) { assert(src); assert(dst); int begin1 = left; int end1 = mid; int begin2 = mid; int end2 = right; int index = begin1; while (begin1 < end1 && begin2 < end2) { if (src[begin1] < src[begin2]) dst[index++] = src[begin1++]; else dst[index++] = src[begin2++]; } while (begin1 < end1) dst[index++] = src[begin1++]; while (begin2 < end2) dst[index++] = src[begin2++]; memcpy(src + left, dst + left, (right - left)*sizeof(int)); } void _merge(int* src, int* dst,int left, int right) { assert(dst); assert(src); if (left + 1 >= right) return; //递归优化 if (right - left < 3) { InsertSort(src, right - left); return; } int mid = left + (right - left) / 2; //递归左右区间 _merge(src, dst, left, mid); _merge(src, dst, mid, right); //合并左右区间 MergeSort(src, dst, left, mid, right); } void Merge(int* arr, int len) { //tmp是一个临时保存排好序的数组 int* tmp = new int[len]; _merge(arr, tmp, 0, len); delete[] tmp; } </span>
相关文章推荐
- java(Merge) 实现归并排序,快速排序
- Java 排序算法-归并排序
- 排序算法总结(4)——归并排序、基数排序
- 归并排序-java
- 二路归并排序(Merge Sort)
- 数组中的逆序对(归并排序思路)
- 归并排序(2-路归并排序)
- MergeSort -- 归并排序
- 归并排序
- 归并排序
- Algorithm(二):归并排序
- 【MOOC】【分治】4.求排列的逆序数——归并排序的应用
- Python算法 归并排序和快速排序
- Java之8大排序(四)-------归并排序,基数排序(java实现)
- 插入排序 和 归并排序(分治)的c实现和时间复杂度分析
- 归并排序
- HDU 1394 Minimum Inversion Number (归并排序 | 线段树 | 数状数组)
- 归并排序
- 归并排序 详解
- 归并排序(python)