引言
数组奇偶分拣,即对数组中的奇数和偶数进行分类,是计算机科学中常见的基础算法问题。这个问题虽然简单,但考察了算法的基本思路和优化技巧。本文将详细介绍几种高效的奇偶分拣算法,并通过实战案例帮助读者深入理解。
奇偶分拣算法概述
1. 冒泡排序法
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。这个过程重复进行,直到没有再需要交换的元素,这意味着该数列已经排序完成。
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] % 2 != 0 and arr[j+1] % 2 == 0:
arr[j], arr[j+1] = arr[j+1], arr[j]
elif arr[j] % 2 == 0 and arr[j+1] % 2 != 0:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
2. 快速排序法
快速排序是一种分而治之的算法。它将原始数组分为较小的两个子数组,然后递归地对这两个子数组进行排序。
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
def partition(arr, low, high):
pivot = arr[high]
i = low - 1
for j in range(low, high):
if arr[j] % 2 != 0 and pivot % 2 == 0:
i += 1
arr[i], arr[j] = arr[j], arr[i]
elif arr[j] % 2 == 0 and pivot % 2 != 0:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i+1], arr[high] = arr[high], arr[i+1]
return i+1
def quick_sort_partition(arr, low, high):
if low < high:
pi = partition(arr, low, high)
quick_sort_partition(arr, low, pi-1)
quick_sort_partition(arr, pi+1, high)
return arr
3. 双指针法
双指针法是一种高效的排序算法,它使用两个指针分别指向数组的两端,然后分别向中间移动,直到两个指针相遇。
def two_pointers_sort(arr):
left, right = 0, len(arr) - 1
while left < right:
while left < right and arr[left] % 2 == 0:
left += 1
while left < right and arr[right] % 2 != 0:
right -= 1
if left < right:
arr[left], arr[right] = arr[right], arr[left]
left += 1
right -= 1
return arr
实战案例
以下是一个使用双指针法对数组进行奇偶分拣的实战案例:
# 定义一个测试数组
test_array = [3, 2, 1, 4, 5, 6, 7, 8, 9, 10]
# 使用双指针法进行奇偶分拣
sorted_array = two_pointers_sort(test_array)
# 打印排序后的数组
print(sorted_array)
输出结果为:[2, 4, 6, 8, 10, 3, 1, 5, 7, 9]
总结
通过本文的介绍,读者应该对数组奇偶分拣问题有了更深入的理解。不同的算法适用于不同的场景,选择合适的算法可以大大提高程序的效率。希望本文能够帮助读者在实战中更好地应用这些算法。
