1. 程式人生 > >資料結構演算法題/將陣列中元素奇數排在前面偶數在後面(前面奇數和後面的偶數不需要有序)

資料結構演算法題/將陣列中元素奇數排在前面偶數在後面(前面奇數和後面的偶數不需要有序)

  處理策略是定義兩個指標pHead,pTail並令其初始指向陣列頭節點和尾節點。pHead從前往後找應該放在尾部的偶數節點,pTail從後往前找應該放在頭部的奇數節點,若pHead位於pTail之前則交換二者內容,否則結束處理過程。

處理流程如下圖所示。從圖中可以看出時間複雜度為O(n)。下面程式碼中外層的迴圈是接著上次交換後的front和end繼續走的,所以是O(n).

對於用例:   1,2,4,5,3

處理結果為:1,3,5,4,2

下面給出在java語言下的實現:

import java.util.Arrays;

public class OddEvenNumber {

    public static void change(int a[]) //將陣列a中奇數放在前面,偶數放在後面
    {
        int len = a.length;
        if(len <= 0)   //陣列長度為0則返回
            return ;
        int front = 0, end = len-1;//設定兩個指標,一個指向頭部,一個指向尾部
        while(front<end)//因為這裡是接著上次交換後的front和end繼續走的,所以是O(n)
        {
//            while(front<len && (a[front]&1)==1)  //從前往後找偶數
            while(front<len && a[front]%2==1)  //從前往後找偶數,前面如果是奇數,那麼繼續往後走
                front++;
            while(end>=0 && a[end]%2==0)   //從後往前找奇數,如果後面是偶數,那麼繼續往前走
                end--;
            if(front<end)//每次互換一組奇數和偶數
            {
                int swap = a[front];   //將奇數往前挪,偶數往後挪
                a[front] = a[end];
                a[end] = swap;
            }
        }
    }


    public static void main(String[] args) {
        int[] arr = {1,2,5,2,4,7,12,3,57,100,5};
        change(arr);
        System.out.println(Arrays.toString(arr));
    }
}

轉自https://blog.csdn.net/u010033948/article/details/51025075?utm_source=copy