日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

剑指Offer #13 调整数组顺序使奇数位于偶数前面 | 图文详解

發(fā)布時(shí)間:2025/3/20 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指Offer #13 调整数组顺序使奇数位于偶数前面 | 图文详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目來(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)。

public class Solution {public void reOrderArray(int [] array) {int size = array.length;for (int i = 0; i < size; i++) {if (array[i] % 2 == 0) {int p = i + 1;//尋找array[i]以后的第一個(gè)奇數(shù)while (p < size && array[p] % 2 != 1) p++;if (p < size) {//array[p]移動(dòng)到array[i]的位置,且將保持相對(duì)位置不變int t = array[p];for (int j = p; j > i; j--) {array[j] = array[j - 1];}array[i] = t;} else {//說(shuō)明已經(jīng)完成了數(shù)組的調(diào)整break;}}}} }

方法二:
這個(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)。

public class Solution {public void reOrderArray(int [] array) {int size = array.length, s1 = 0, s2 = 0;//專(zhuān)門(mén)用于存儲(chǔ)的偶數(shù)的數(shù)組int [] evens = new int[size];for (int i = 0; i < size; i++) {//篩選過(guò)程,將奇數(shù)和偶數(shù)分開(kāi)if (array[i] % 2 == 1) {array[s1++] = array[i];} else {evens[s2++] = array[i];}}//將偶數(shù)接到奇數(shù)后面for (int i = 0; i < s2; i++) {array[s1++] = even[i];}} }

如果本文對(duì)你有所幫助,要記得點(diǎn)贊哦~

總結(jié)

以上是生活随笔為你收集整理的剑指Offer #13 调整数组顺序使奇数位于偶数前面 | 图文详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。