對給定數組按奇偶性劃分,不改變相對順序

來源:互聯網
上載者:User
問題描述

給定一個數組,比如 arr = { 1, 3, 1, 4, 1, 5, 2, 0},對該數組進行整理,使得所有奇數都在前面,所有的偶數都在後面,且保證所有奇數的相對順序不改變,所有偶數的相對順序不改變。 問題解決 Solution1:T(n) = O(n^2), S(n) = O(1)

利用冒泡排序的思想,對數組進行整理即可。
思想:掃描數組,針對每個發現的奇數,都利用冒泡技術,往前移動該奇數,直到碰見了其他奇數。 Solution2:T(n) = O(n), S(n) = O(n)

如果空間複雜度達到S(n) = O(n),那麼其實很簡單: 建立一個數組,儲存順序掃描到的奇數 再次掃描原數組,在上述數組中儲存掃描到的所有偶數 然後把新數組的元素拷貝到原數組即可 Solution3:T(n) = O(n log n),S(n) = O(1)

針對數組利用分而治之的思想: 對數組左半部分進行奇偶劃分; 對數組右半部分進行奇偶劃分; 現在數組的狀態是:|奇數|偶數|奇數|偶數|,針對第二和第三部分,進行整體對調即可

對調的API:

void swap(vector<int> &arr, int i, int j, int k) {    reverse(arr, i, j);    reverse(arr, j+1, k);    reverse(arr, i, k);}

因此時間複雜度是: T(n) = T(n/2) + T(n/2) + O(n), 因此T(n) = O(n log n)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.