1. 程式人生 > >只含有0,1,2的陣列的排序(java實現)

只含有0,1,2的陣列的排序(java實現)

要求對只含有0,1,2的陣列進行排序,時間複雜度為O(n),空間複雜度為1

秋招筆試題

/*思路:
 * 設定三個標記指標:iZero, iOne, iTwo
 * 令iZero從前往後遍歷,指向第一個非0的位置,iTwo從後往前遍歷,指向第一個非2位置然後iOne從iZero開始往後遍歷:
 * 遇到0就和iZero交換,iZero++;遇到1則iOne++;遇到2就和iTwo交換,iTwo向前滑動到下一個非2的位置,交換後還
 * 要重新檢查iOne的值;直到iOne與iTwo相遇。一次遍歷,複雜度是O(n),因為每次操作都使得陣列更為有序,不像小塊排序
 * 需要重複比較,所以比應用快排的方法效率高一些.
 * Before...
 *1 2 0 0 2 1 2 1 1 0 2 2 1 0 
 *After...
 *0 0 0 0 1 1 1 1 1 2 2 2 2 2 
 */
 
public class Order {
	public int arr[] = {1,2,0,0,2,1,2,1,1,0};
	public int iLength;
	public int iZero, iOne, iTwo;// 類似於三個指標

	void swap(int x, int y) //交換陣列中的兩個位置的值
	{
		int temp = arr[x];
		arr[x] = arr[y];
		arr[y] = temp;
	}

	void sort()
	{
		//iZero,iOne從前往後,iTwo從後往前
		while(arr[iZero]==0) //填空1
		{
			iZero++;
			iOne++;
		}

		while(arr[iTwo] == 2)
		{
			iTwo--;
		}

		while(iOne <=iTwo)//填空2
		{
			if (arr[iOne]==2)
			{
				swap(iOne,iTwo);//填空3;
				iTwo--;
				while(arr[iTwo]==2)
				{
					iTwo--;
				}
			}
			while(arr[iOne]==1)
			{
				iOne++;
			}
			if (arr[iOne]==0)//填空4
			{
				swap(iOne, iZero);
				iZero++;
				iOne++;
			}
		}
	}

	public static void main(String[] args) {
		Order order = new Order();
		order.iLength = order.arr.length;// 填空5
		order.iZero=0;
		order.iOne=0;
		order.iTwo=order.iLength-1;

		System.out.println("Before...");
		for (int i=0;i<order.iLength;i++)
		{
			System.out.print(order.arr[i]+" ");
		}
		order.sort();
		System.out.println("\nAfter...");
		for (int i=0;i<order.iLength;i++)
		{
			System.out.print(order.arr[i]+" ");
		}
	}
}