2012百度暑期实习_空间复杂度为O(1)的排序算法的实现(java)
来源:互联网 发布:python 入门书籍 编辑:程序博客网 时间:2024/05/21 15:49
上周日参加了百度的暑期实习笔试,感觉到自己真的是很水啊,基本上都不会,看来如果自己将来真的想做技术,真的还有太多太多的东西要学。。。
今天有时间就仔细整理了一下那个空间复杂度为O(1)的排序算法的流程,并用javav代码实现了一下。现在贴出来和大家分享一下,如果有什么不合适的地方,还希望大家多提意见。
题目如下:
数组al[0...num-1]可以分为两部分,al[0...mid-1]和al[mid...num-1],并且这两部分都各自有序。请将数组两部分merge(合并),形成一个总体有序的数组,并且要求空间复杂度为O(1)。
实现代码:
public class MergeSort201205 {public MergeSort201205(){}private int[] al;private int mid;private int num;public int getMid() {return this.mid;}public void setMid(int mid) {this.mid = mid;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public void setAl(int[] al){this.al = al;}public int[] getAl(){return this.al;}public void mergeSort(){int i = 0;int j = mid;//如果al[0~mid-1]是按降序排列,则整体按降序排列if(al[0] > al[mid-1]){//使al[mid,num-1]和al[0,mid-1]是一致的排列顺序if(al[mid] < al[num-1]){int end = (num - mid)/2;for(int m = 0; m < end; m++){int temp = al[num - 1 - m ];al[num - 1 - m ] = al[mid + m];al[mid + m] = temp;}}if(al[mid-1] >= al[mid]){return;}else{this.mergeSortDesc(i,j);}//如果al[0~mid-1]是按升序排列,则整体按升序排列}else if(al[0] < al[mid-1]){//使al[mid,num-1]和al[0,mid-1]是一致的排列顺序if(al[mid] > al[num-1]){int end = (num - mid)/2;for(int m = 0; m < end; m++){int temp = al[num - 1 - m ];al[num - 1 - m ] = al[mid + m];al[mid + m] = temp;}}if(al[mid-1] <= al[mid]){return;}else{this.mergeSortAsc(i,j);}}}/** * 整体按降序排列的排序算法 * Author: * 2012-5-8 下午2:40:09 * @param i * @param j * @return void */public void mergeSortDesc(int i,int j){if((i < this.num) && (j < this.num) && (i < j)){if(al[i] >= al[j]){i++;mergeSortDesc(i,j);//如果al[i]小于al[j],则把al[j]插入到al[i]前面,//而al[i]和al[j]之间的元素整体往后搬移一位}else{int temp = al[j];for(int m = j;m > i;m--){al[m] = al[m-1];}al[i] = temp;i++;j++;mergeSortDesc(i,j);}}}/** * 整体按升序排列排序的排序算法 * Author: * 2012-5-8 下午2:39:36 * @param i * @param j * @return void */public void mergeSortAsc(int i,int j){if(i < this.num && j < this.num && i < j){if(al[i] <= al[j]){i++;this.mergeSortAsc(i,j);//如果al[i]大于al[j],则把al[j]插入到al[i]前面,//而al[i]和al[j]之间的元素整体往后搬移一位}else{int temp = al[j];for(int m = j;m > i;m--){al[m] = al[m-1];}al[i] = temp;i++;j++;mergeSortAsc(i,j);}}}}public class TestMergeSort {public TestMergeSort() {// TODO Auto-generated constructor stub}public static void main(String[] args) {MergeSort201205 ms = new MergeSort201205();int mid = 5;int num = 10;int[] al = {2,5,7,9,11,15,13,10,8,7};ms.setAl(al);ms.setMid(mid);ms.setNum(num);DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("begin at:" + df.format(new Date()));System.out.println(Arrays.toString(al));ms.mergeSort();System.out.println("end at:" + df.format(new Date()));System.out.println(Arrays.toString(al));}}
- 2012百度暑期实习_空间复杂度为O(1)的排序算法的实现(java)
- 一个时间复杂度为O(n),空间复杂度为O(1)的排序算法
- 时间复杂度为O(N),空间复杂度为O(1)的排序算法
- 不用额外空间的整数交换以及时间复杂度为O(n)空间复杂度为O(1)的排序算法
- 百度笔试题之归并排序总结----空间复杂度为O(m+n)的归并排序与空间复杂度为O(1)的归并排序
- 手摇算法(三重翻转算法)和空间复杂度为o(1)的归并排序
- 排序的时间复杂度为O(n),空间复杂度为O(1)
- 原地归并算法(空间复杂度为O(1)的归并排序)
- 反转链表:空间复杂度为O(1)的算法
- 时间复杂度O(n),空间复杂度O(1)的排序
- 实现一个排序算法,对0~n-1范围内的n个不重复的无序数组进行排序,时间复杂度为O(n),空间复杂度为O(1)。
- 归并排序,空间复杂度O(1)的实现
- 归并排序空间复杂度O(1)的实现
- java的BitSet实现位排序算法,复杂度为O(n)
- 时间复杂度为o(1)的排序算法
- O(1)空间复杂度的归并排序
- O(1)空间复杂度的归并排序
- 有1,2,....一直到n的无序数组,求排序算法,要求时间复杂度为O(n),空间复杂度O(1)
- 合成(Composite)模式
- Linux下的多线程编程
- ASCII表的简要记法
- 多进程和多线程编程
- css小知识
- 2012百度暑期实习_空间复杂度为O(1)的排序算法的实现(java)
- 介绍一下神器mimikatz,从lsass里抓密码
- PL/SQL 集合的方法
- [Python] 如何证明两组样本有显著性差异(t-test假设检验)
- 磁盘镜像配置DRBD配置
- ping百度的时候出现ping www.a.shifen.com
- 当我看到这个,我放弃安装小蓝鱼了
- HTML5布局结构
- 开发if,else标签