遍歷數組排序,負數在左,正數在右

原文:https://tryenough.com/1999/


問題描述:

有一個整形數組,包含正數和負數,然後要求把數組內的所有負數移至正數的左邊,且保證相對位置不變,要求時間複雜度爲O(n), 空間複雜度爲O(1)。例如,{10, -2, 5, 8, -4, 2, -3, 7, 12, -88, -23, 35}變化後是{-2, -4,-3, -88, -23,5, 8 ,10, 2, 7, 12, 35}。

解決方法

原文:https://tryenough.com/1999/

實現原理是:兩個變量記錄左右節點,兩邊分別開始遍歷。左邊的節點遇到負值繼續前進,遇到正值停止。右邊的節點正好相反。然後將左右節點的只進行交換,然後再開始遍歷直至左右節點相遇。

這種方式的時間複雜度是O(n).空間複雜度爲O(1)

以下爲java的實現:

原文:https://tryenough.com/1999/

public void setParted1(int[] a, int left, int right) {
        if (left >= right || left == a.length || right == 0) {
            for (int i = 0; i < a.length; i++) {
                System.out.println(a[i]);
            }
            return;
        }
        while (a[left] < 0) {
            left++;
        }
        while (a[right] >= 0) {
            right--;
        }
        if (left >= right || left == a.length || right == 0) {
            for (int i = 0; i < a.length; i++) {
                System.out.println(a[i]);
            }
            return;
        }
        swap(a, left, right);
        left++;
        right--;
        setParted1(a, left, right);
    }

    private void swap(int a[], int left, int right) {
        int temp = 0;
        temp = a[left];
        a[left] = a[right];
        a[right] = temp;
    }

原文:https://tryenough.com/1999/

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