2012百度暑期实习_空间复杂度为O(1)的排序算法的实现(java)

上周日参加了百度的暑期实习笔试,感觉到自己真的是很水啊,基本上都不会,看来如果自己将来真的想做技术,真的还有太多太多的东西要学。。。

今天有时间就仔细整理了一下那个空间复杂度为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));
	}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值