code(05)

     一、荷兰国旗问题。将由0,1,2 三个数字组成的数组顺序排列。 扩展问题:将数组中的第一个元素,比它小的放在左边,相等的放在中间,大于的放在后边。

           解法:时间复杂度O(n).

           我们的思路如下:将前部和后部各排在数组的前边和后边,中部自然就排好了。具体的:
          设置两个标志位begin和end分别指向这个数组的开始和末尾,然后用一个标志位current从头开始进行遍历:

          1)若遍历到的位置为0,则说明它一定属于前部,于是就和begin位置进行交换,然后current向前进,begin也向前进(表示前边的已经都排好了)。
          2)若遍历到的位置为1,则说明它一定属于中部,根据总思路,中部的我们都不动,然后current向前进。
          3)若遍历到的位置为2,则说明它一定属于后部,于是就和end位置进行交换,由于交换完毕后current指向的可能是属于前部的,若此时current前进  则会导致该位置不能被交换到前部,所以此时current不前进,end向前走一个。


         

 public void sort(int[] arr){
		  int start=0,end=arr.length-1,current=0;  //start之前的,end之后的已经排好
		  while(current<=end){
			  if(arr[current]<1){  //current小于1时
				  int tmp=arr[current];  //交换current和start,current往前,start往前
				  arr[current]=arr[start];
				  arr[start]=tmp;   
				  start++;
				  current++;
			  }
			  else if(arr[current]>1){   //current大于1时
				  int tmp=arr[current];  //交换current和end,current不动,end向前
				  arr[current]=arr[end];
				  arr[end]=tmp;
				  end--;
			  }else             //current等于1时
				  current++;    //current往前
		  }
	  }

      
         //扩展问题
	  public void sort02(int[] arr){
		  int val=arr[0];
		  int start=0,end=arr.length-1,current=0;
		  while(current<=end){
			   if(arr[current]<val){
				   int tmp=arr[current];
				   arr[current]=arr[start];
				   arr[start]=tmp;
				   start++;
				   current++;
			   }
			   else if(arr[current]>val){
				   int tmp=arr[current];
				   arr[current]=arr[end];
				   arr[end]=tmp;
				   end--;
		  }else
			  current++;
	  }
}


         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值