一般來說,判斷乙個陣列或序列是正序,倒序還是亂序,需要我們將這個陣列完整的遍歷一遍後才能得出答案,它不像折半查詢那樣只處理少量的資料便能得出結論,因為一段包含成千上萬個元素的有序序列,哪怕將其中兩個元素的位置調換都能將這個序列變成亂序序列.如下面這段序列,只是數字8和9調換,就變成了亂序的.
[0, 1, 2, 3, 4, 5, 6, 7, 9, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
那麼,怎樣才能快速的判斷序列是否有序呢?
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] // 序列arraya
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] // 序列arrayb
[12, 7, 2, 5, 4, 14, 6, 13, 1, 16, 18, 19, 9, 8, 15, 11, 10, 0, 17, 3] // 序列arrayc
上面三段序列,分別為正序, 亂序和無序, 我們觀察發現, 假如用冒泡法排序的單次冒泡迴圈對以上三個陣列進行排序(排序順序為從小到大), 第乙個序列(正序序列)的冒泡次數為0; 第二個序列(倒序序列)的冒泡次數為 : 序列長度 - 1; 第三個序列(亂序序列)的冒泡次數介於上面兩種序列之間, 且中途"氣泡"(即需要進行交換的元素)發生了變化. 以此為規律, 我們可以利用計數冒泡次數和氣泡是否發生了改變來判斷一段有限序列是正序, 倒序還是無序.
// 根據陣列需要冒泡的次數判斷陣列為順序,逆序還是無序
public static int lookarray(int array)
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
// 兩相鄰元素交換一次值,count計數一次
count++;
pop = array[j + 1];
//氣泡向右移動,可能是逆序,對於逆序序列,還需保證氣泡左側所有的元素大於右側
//所以當左側最小的元素小於右側元素時,為無序序列
if (j + 2 < array.length )}}
}// 正序返回 1, 倒序返回 -1
if (count == 0) else
}
至此,我們實現了判斷序列是否有序的演算法. 我們可以在程式主入口main中呼叫這個方法,用一段亂序序列檢驗輸出:
int array = ;
int x = lookarray(array);
if (x == 1) else if (x == - 1) else if(x == 0)
輸出為:
無序
至此,我們簡單的實現了判斷一段有限序列為正序,倒序,亂序的判別方法. 判斷乙個陣列是否包含另乙個陣列
function iscontainarr parent,child let parent 1,2,3,6,5,4 let child 1,3,4,6 let child2 1,3,4,6,7 console.log iscontainarr parent,child true console.lo...
判斷乙個陣列是否為空陣列
最近在做乙個專案,遇到乙個需要判斷乙個陣列是否為空陣列的問題。一般的,當被測試的陣列是乙個一維陣列的時候,只要簡單的用 bool empty array 就能解決問題。當被測試的陣列為二維陣列時,empty函式返回的是true,這顯然不行。像下段 中,array 是個空陣列。array array ...
判斷乙個陣列是否是另乙個陣列的子集
給兩個陣列 arr1 0.m 1 和arr2 0.n 1 判斷arr2是否是arr1的乙個子集合,兩個陣列都是未排序的。例子 input arr1 arr2 output arr2 is a subset of arr1 input arr1 arr2 output arr2 is a subset...