调整数组顺序使奇数位于偶数前面

【转】参考:https://blog.youkuaiyun.com/besmarterbestronger/article/details/94960879

题目:

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变

复习冒泡排序:

def maopao(array):
    for i in range(len(array)):
        for j in range(len(array) - i - 1):
            if array[j] > array[j+1]:
                array[j], array[j+1] = array[j+1], array[j]
    return array

b = maopao([5, 4, 3, 2])
print(b)
# 笨方法,空间换时间把,这里不整那些双指针了
class Solution:
    def reOrderArray(self, array):
        # write code here
        a = []
        b = []
        for i in array:
            if i & 1:
                a.append(i)
            else:
                b.append(i)
        return a + b

复习快速排序(基础版本 + 进阶版):

def quicksort(array):
    """常规思路,缺点需要开辟新的数组,不能原地排序"""
    if len(array) < 2:
        return array
    else:
        index = 0
        pivot = array[index]
        less = [i for i in array[1:] if i <= pivot]
        great = [i for i in array[1:] if i > pivot]
        return quicksort(less) + [pivot] + quicksort(great)

def partition(array, beg, end):
    """双指针思路, 利用partition原地排序"""
    pivot_index = beg
    pivot = array[pivot_index]

    left = pivot_index + 1
    right = end - 1

    while True:
        while left <= right and array[left] < pivot:
            left += 1

        while right >= left and array[right] >= pivot:
            right -= 1

        if left > right:
            break
        else:
            array[left], array[right] = array[right], array[left]

    array[pivot_index], array[right] = array[right], array[pivot_index]
    return right


def quicksort2(array, beg, end):
    if beg < end:
        pivot = partition(array, beg, end)
        quicksort2(array, beg, pivot)
        quicksort2(array, pivot + 1, end)

def test():

    # seq = list(range(5))
    seq = [1, 3, 2, 4, 0]
    # random.shuffle(seq)
    print("seq = ", seq)
    quicksort2(seq, 0, len(seq))
    print(seq)

if __name__ == "__main__":
    test()

# seq =  [1, 3, 2, 4, 0]
# [0, 1, 2, 3, 4]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值