百度笔试题之归并排序总结----空间复杂度为O(m+n)的归并排序与空间复杂度为O(1)的归并排序
来源:互联网 发布:java的保留字有哪些 编辑:程序博客网 时间:2024/05/21 21:47
题目:数组a[0,m] 和 a[m+1,m+n],都分别有序。将其merge成有序数组a[0,m+n]。(注:这里用的两个数组是分别有序的)
受这个题目启发,简单总结了一下Merge Sort:
1。空间复杂度为O(m+n):
MergeSort算法思想大家比较熟悉,如果空间复杂度是O(m+n)的话,只需临时申请一段m+n个元素的数组空间,分别比较a数组和b数组中已经排序的最小值,取出放入c数组中,当a或b数组中其中一个中的元素取完后,另一个数组中剩下的元素直接放入数组c后面即可,现在已经完成归并排序,如果只是将c数组作为临时数组,最后可将c中的元素转移到a和b的空间中。
代码如下:
#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace std;//将有序数组a[]和b[]合并到c[]中//比较好理解,不再写注释void MergeSort(int a[], int n, int b[], int m, int c[]){int i=0, j=0, k=0;while (i < n && j < m){if (a[i] < b[j])c[k++] = a[i++];elsec[k++] = b[j++];}while (i < n)c[k++] = a[i++];while (j < m)c[k++] = b[j++];}int main(){ int a[] = {1,3,5,7,9}; int b[] = {2,4,6,8,10}; int m = sizeof(a)/sizeof(int); int n = sizeof(b)/sizeof(int); int c[10] = {0}; MergeSort(a, m, b, n, c); //当数组作为参数时,只需将名字传入,其实是传指针。 for(int i = 0; i<10; i++) printf(" %d ",c[i]); return 0;}
我的思路是:在不借助辅助数组的情况下,在a和b数组空间上直接Merge。
因为a和b都已经排好序,首先比较a[0,m]和a[m+1,m+n]的第一个元素,如果将小的放在a[0],并将a[m+1,m+n]进行重排序(插入排序),当a[0,m]填满了的时候,最后一次对a[m+1,m+n]插入排序后,即完成了归并排序。
代码如下:
#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace std;//将两个有序数组用O(1)的空间复杂度实现Merge排序void MergeSort(int a[], int m, int n){ int i = 0; while(i <= m) { //当a[i] > a[n]时,两元素交换,使得相对较小的元素在a[i]中。 if(a[i] > a[n]) { int temp = a[i]; a[i] = a[n]; a[n] = temp; //对数组后半部分新添加的值插入到有序数组中,成新的有序数组 for(int j = 0; j< n; j++) { if(a[n+j] > a[n+j+1]) { temp = a[n+j]; a[n+j] = a[n+j+1]; a[n+j+1] = temp; } else break; } i++; } else i++; }}int main(){ //简单测试用例 int a[] = {1,3,5,7,9,1,4,6,8,10}; int m = 4; int n = 5; MergeSort(a, m, n ); for(int i = 0; i<10; i++) printf(" %d ",a[i]); return 0;}
- 百度笔试题之归并排序总结----空间复杂度为O(m+n)的归并排序与空间复杂度为O(1)的归并排序
- O(1)空间复杂度的归并排序
- O(1)空间复杂度的归并排序
- 原地归并算法(空间复杂度为O(1)的归并排序)
- 归并排序,空间复杂度O(1)的实现
- 归并排序空间复杂度O(1)的实现
- 手摇算法(三重翻转算法)和空间复杂度为o(1)的归并排序
- 归并排序的空间复杂度为什么是O(n)?快速排序的空间复杂度为什么是O(log2n)?
- 单链表的归并排序:时间复杂度O(nlogn),空间复杂度O(1)
- 归并排序、快速排序---时间复杂度为O(nlog n)的排序方式
- 一个时间复杂度为O(n),空间复杂度为O(1)的排序算法
- 排序的时间复杂度为O(n),空间复杂度为O(1)
- 时间复杂度为O(N),空间复杂度为O(1)的排序算法
- 就地归并排序inplacMergeSort,空间复杂度O(1)
- 时间复杂度O(n),空间复杂度O(1)的排序
- 在空间复杂度O(1)的条件下实现归并排序[原创]
- 归并排序及其空间复杂度的思考
- 不用额外空间的整数交换以及时间复杂度为O(n)空间复杂度为O(1)的排序算法
- 集合框架总述
- X264代码跟踪之x264_ratecontrol_mb
- Android使用ViewPager实现左右滑动效果
- C++的头文件和实现文件分别写什么
- 与、或、非、同或、异或、蕴含的表示 C/C++
- 百度笔试题之归并排序总结----空间复杂度为O(m+n)的归并排序与空间复杂度为O(1)的归并排序
- 家庭网络式电脑电视之我见(内室版)
- 学习笔记——文字编辑(小结)
- 程序员努力提升自我的途径
- Struts2的声明式异常处理
- 世界上最贵的跑车大全
- shell@android:/ $ [ 11.338287] (stc): remove_channel_from_table: id 2
- Linux Gdb调试笔记--最基本的3个步骤
- codeblocks快捷键(转载)