剑指Offer #13 调整数组顺序使奇数位于偶数前面 | 图文详解
題目來(lái)源:??途W(wǎng)-劍指Offer專(zhuān)題
題目地址:調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面
題目描述
輸入一個(gè)整數(shù)數(shù)組,實(shí)現(xiàn)一個(gè)函數(shù)來(lái)調(diào)整該數(shù)組中數(shù)字的順序,使得所有的奇數(shù)位于數(shù)組的前半部分,所有的偶數(shù)位于數(shù)組的后半部分,并保證奇數(shù)和奇數(shù),偶數(shù)和偶數(shù)之間的相對(duì)位置不變。
題目解析
對(duì)于這道題,有三種實(shí)現(xiàn)方式,時(shí)間復(fù)雜度分別為 O(n2)O(n^2)O(n2)、 O(nlogn)O(n logn)O(nlogn) 和 O(n)O(n)O(n),下面我們來(lái)逐一介紹:
方法一:
思路類(lèi)似于插入排序:遍歷 arrayarrayarray ,當(dāng)遇到array[i]偶數(shù)時(shí),就p=i+1位置開(kāi)始尋找第一個(gè)奇數(shù)。如果找到了,則將array[p]移動(dòng)到array[i]前面。否則,說(shuō)明數(shù)組的調(diào)整已經(jīng)完成,遍歷停止。
上圖是某次遇到偶數(shù)時(shí)的執(zhí)行圖示,供大家理解。這個(gè)算法的時(shí)間復(fù)雜度為 O(n2)O(n^2)O(n2)。
方法二:
這個(gè)種做法的思路源于歸并排序,是我參考Cyril-廖思睿博客的思路(長(zhǎng)見(jiàn)識(shí)了)。
如果你學(xué)了歸并排序,理解下面代碼不會(huì)有任何難度,詳情可以看注解(不懂留言也可 )。算法時(shí)間復(fù)雜度為 O(nlogn)O(n logn)O(nlogn)。
public class Solution {public void reOrderArray(int [] array) {if (array == null || array.length < 2) {return ;}orderProcess(array, 0, array.length - 1);}public void orderProcess(int [] array, int left, int right) {if (left == right) {return ;}int mid = left + ((right - left) >> 1);//進(jìn)行劃分操作orderProcess(array, left, mid);orderProcess(array, mid + 1, right);//進(jìn)行合并操作mergeOrder(array, left, mid, right);}//進(jìn)行合并操作public void mergeOrder(int [] array, int left, int mid, int right) {int len = right - left + 1, pLeft = left, pRight = mid + 1, p = 0;//暫時(shí)存空間int temp[] = new int[len];//為了保持相對(duì)順序不變,先放左邊的奇數(shù)while (pLeft <= mid && array[pLeft]%2 == 1) {temp[p++] = array[pLeft++];}while (pRight <= right && array[pRight]%2 == 1) {temp[p++] = array[pRight++];}//為了保持相對(duì)順序不變,先放左邊的偶數(shù)while (pLeft <= mid) {temp[p++] = array[pLeft++];}while (pRight <= right) {temp[p++] = array[pRight++];}//將暫存空間中的數(shù)移回原數(shù)組中for (int k = 0; k < len; k++) {//注意相對(duì)位置array[left + k] = temp[k];}} }方法三
這種方法是一種空間換時(shí)間的一種策略,多開(kāi)一個(gè)專(zhuān)門(mén)用于存儲(chǔ)的偶數(shù)的數(shù)組 evensevensevens,在遍歷的過(guò)程中,將偶數(shù)按原來(lái)的相對(duì)順序放到 evensevensevens 中;而奇數(shù)也在原數(shù)組中按原來(lái)的相對(duì)順序,進(jìn)行緊湊操作(直接放到上一個(gè)奇數(shù)后面)。如下圖所示:
最后,將偶數(shù)(evensevensevens)接到回奇數(shù)(原數(shù)組)后面,就完成了我們的調(diào)整,時(shí)間復(fù)雜度為O(n)O(n)O(n)。
如果本文對(duì)你有所幫助,要記得點(diǎn)贊哦~
總結(jié)
以上是生活随笔為你收集整理的剑指Offer #13 调整数组顺序使奇数位于偶数前面 | 图文详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 剑指Offer #12 数值的整数次方(
- 下一篇: 剑指Offer #14 链表中倒数第k个