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));}}


原创粉丝点击