不改變相對順序,負數左邊正數右邊

2021-06-25 11:58:39 字數 1018 閱讀 5883



不改變正負數之間的相對順序重新排列陣列,使得負數字於正數之前;

(1)舉例:

如:1,7,-5,2,-9,3變成 -5,-9,1,7,2,3

(2)方法一:

從頭到尾掃瞄陣列,每次碰到乙個正數時,就把位於這個數字之後的所有數字到往前挪動一位。挪動之後在陣列的末尾有乙個空位,把這個正數填進去。整體的時間複雜度為o(n^2),空間複雜度為o(1)

(3)方法二 :

快速排序中的劃分partition,雙向掃瞄,乙個指標從左往右掃瞄直到遇到乙個正數,另乙個指標從右往左掃瞄直到遇到乙個負數,然後交換兩個數。但是遺憾的是這樣會改變正負數之間的相對順序。不能達到要求。

(4)方法三:

建立2個大小為n的佇列,乙個儲存正數,乙個儲存負數,遍歷陣列,將正數新增到正數佇列,負數新增到負數佇列。然後分別將負數佇列,以及正數佇列出隊到陣列中。

時間複雜度為o(n),空間複雜度為o(n);

(5)方法四:

1)思想:

從右往左掃瞄,尋找最大最近的負數區間,以及該負數區間左邊最大最近的正數區間,然後將這兩個區間利用迴圈右移的方法移動,使得負數區間在正數區間的前面。

繼續尋找最大最近的負數區間(在上乙個負數區間的基礎上),以及最大最近的正數區間。然後繼續迴圈右移;。。。。。。。

(利用的是迴圈右移中,a,bcd->bcd,a中,bcd的相對順序沒有發生變化)

2)舉例:

1,3,-1,2,-5,6(從右往左掃瞄,最大最近的負數區間為-5,它左邊的最大最近正數區間為2)-》

1,3,-1,-5,2,6-》(最大最近的負數區間為-1,-5,2,其左邊最大最近的正數區間為1,3)-》

-1,-5,1,3,2,6

3)實現:

/*字串str[left,right]逆序。*/

void reverse(int *str ,int left ,int right)

void movesort(int a, int len)

else

break;

n0--;}}

不改變正負數相對順序重新排列陣列

class program posinum,neganum int index 0 int opercount 1 int maxnum 0 for int i 0 i numofnum i if math.abs inputarray i maxnum maxnum math.abs inputa...

不改變正負數相對順序重新排列陣列

看到網上乙個解法,空間複雜度o 1 時間複雜度o nlogn 做乙個小演算法題,提提神 乙個未排序整數陣列,有正負數,重新排列使負數排在正數前面,並且要求不改變原來的正負數之間相對順序。思考的過程就略去了,直接說結果吧。我想到的演算法,空間複雜度為o 1 時間複雜度為o n logn 首先,定義這樣...

python列表排序不改變順序

去重可以亂序lis 3 1,4 3,6 3,2 4,9 1 lis2 list set lis print lis2 去重不改變原始順序 本質上 func1 func3 和 func6原理是一樣的,將列表遍歷一次,第一次出現到放到新到列表中 func2 func4 和 func5原理是一樣的,先將列...