問題描述:假設某個數組中只有數字 1 和 2,進行排序,使得數字 1 位於數組前部分,數字 2 位於後部分。javascript
這道算法題其實不是很難,使用各類排序算法應該都能解出,可是若要考慮性能問題,那就得選擇一種算法複雜度最低的解法。這裏我使用雙指針的方法來解答該題,時間複雜度爲 O(n)
。java
(1)設置一個頭指針、一個尾指針,頭指針首先指向數組的第一個元素(索引爲 0),而尾指針則指向數組的最後一個元素(索引爲 len - 1,假定數組的長度爲 len);算法
(2)而後比較這兩個一前一後元素的大小;數組
(3)接着再次比較頭、尾指針指向元素的大小,決定是否交換值以及移動指針;性能
(4)依照以上步驟進行指針移動、元素大小比較,即可使得數字 1 位於數組前部分,數字 2 位於數組後部分。測試
注意點:上面循環進行操做的條件是頭指針索引值小於尾指針索引值。ui
書寫的代碼以下:spa
function sortOneTwoInArr (arr) {
var len = arr.length;
var head = 0;
var tail = len - 1;
/* 遍歷數組,對 1 和 2 進行排序 */
while (head < tail) {
// 若頭、尾指針指向的元素大小相等則只移
// 動一個指針,不然同時移動兩個指針
if (arr[head] === arr[tail]) {
if (arr[head] === 1) {
head++;
} else if (arr[head] === 2) {
tail--;
}
} else {
if (arr[head] > arr[tail]) {
[arr[head], arr[tail]] = [arr[tail], arr[head]];
}
head++;
tail--;
}
}
return arr;
}
/* 測試用例 */
var arr1 = [];
var arr2 = [1];
var arr3 = [2];
var arr4 = [1, 2, 1, 2];
var arr5 = [1, 1, 2, 2];
var arr6 = [1, 2, 2, 1, 1];
var arr7 = [2, 2, 1, 1, 2];
console.log(sortOneTwoInArr(arr6)); // [1, 1, 1, 2, 2]
複製代碼