Sort Array By Parity

twisted-fate發表於2019-06-21

畫圖/定義/虛擬碼/情況分析

不使用額外空間
nums=[1,2,3,4]

func f(nums) {

    p1=0
    p2=-1

    if empty {

    }

}

定義:[p1,p2]的是奇數 , (p2,end]的是偶數
情況討論:

陣列為空 return 陣列
陣列只有一個元素 return 陣列
陣列有偶數個 , 奇數個 , 好像沒關係

[p1,p2]的後一個元素是奇數 , 直接p2++
後一個元素不是奇數 , 新增p3指標, 找到最近的一個奇數, swap(p2+1,p3) , 然後p2++ , 如果找不到p3, 直接return
p2沒有後一個元素了,直接return

複雜度分析 : 
全部元素都是奇數 , or 都是偶數 O(n)  or 分佈接近規律
我靠不好分析 , 主要是else裡的for迴圈的情況:

使用額外空間 遍歷一遍就行了 , 簡單

開闢同樣大小的陣列 , 奇數放左邊 , 偶數從右邊開始放 
//額外空間
func sortArrayByParity(A []int) []int {
    len := len(A)
    if len == 0 || len == 1 {
        return A
    }

    new:=make([]int,len)
    p1:=0
    p2:=len-1
    for i:=0;i<=len-1;i++ {
        if A[i]%2==0 {
            new[p1]=A[i]
            p1++
        } else {
                new[p2]=A[i]
                p2--
        }
    }
    return new

}

//不使用額外空間
func sortArrayByParity1(A []int) []int {
    len := len(A)
    if len == 0 || len == 1 {
        return A
    }

    //p1 := 0
    p2 := -1

    for p2+1 <= len-1 {
        if A[p2+1]%2 == 0 {
            p2++
        } else {
            p3:=p2+1
            for i:=p3;i<=len-1;i++ {
                if A[i]%2==0 {
                    tmp:=A[p3]
                    A[p3]=A[i]
                    A[i]=tmp
                    p2++
                    break
                }
                //優化 , 當p3往後遍歷都沒有奇數的時候 , 直接返回
                if i==len-1 && A[i]%2==1 {
                    return A
                }
            }
        }
    }
    return A
}

Sort Array By Parity

Sort Array By Parity

相關文章