對只包含0、1、2三種元素的數組進行排序

時間複雜度:o(n)

兩種方法,都是隻遍歷一次;

/*借鑑《算法》中,當數組中存在大量重複元素時,對快排partition方法的改進。
 *即三個指針,把數組劃分成三部分,<x、=x、>x*/
public void sortarray2(int[] nums){
	int a = 0;//指向下一個存放0的位置
	int b = nums.length-1;//從右向左,下一個存放2的位置
	int i = a;
	while(i<=b){
		if(nums[i] == 1)
			i++;
		else if(nums[i] == 2)
			exchange(nums,i,b--);
		else
			exchange(nums,i++,a++);
	}	
}
/*只能遍歷一遍,從左向右遍歷*/
public void sortarray1(int[] nums){
	int i=-1;
	int j=-1;
	int k=-1;
	for(int p=0;p<nums.length;p++){
		if(nums[p] == 0){
			if(i == -1)
				i = 0;//第一個0的位置
			if(j != -1){
				for(int t=p;t>j;t--)
					nums[t] = nums[t-1];
				nums[j] = 0;
				j++;
				if(k != -1)k++;
			}
			else if(k != -1){
				for(int t=p;t>k;t--)
					nums[t] = nums[t-1];
				nums[k] = 0;
				k++;
			}
			else
				;
		}
		else if(nums[p] == 1){
			if(j == -1){
				if(k != -1) j = k;
				else j = p;
			}
			if(k != -1){
				exchange(nums,p,k);
				k++;
			}
			else
				;
		}
		else if(nums[p] == 2){
			if(k == -1)
				k = p;
		}
		else
			;
	}
}
public void exchange(int[] nums,int a,int b){
	int tmp = nums[a];
	nums[a] = nums[b];
	nums[b] = tmp;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章