只含有0,1,2的陣列的排序(java實現)
阿新 • • 發佈:2018-12-12
要求對只含有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]+" "); } } }