交换排序 ——
冒泡排序
基本思想:从一端开始,逐个比较相邻的两个元素,发现倒序即交换。这里按从后往前(从下往上)逐个比较相邻元素。
数组冒泡排序过程
def bubbleSort(arr):
n = len(arr)
# 遍历所有数组元素
for i in range(n):
# Last i elements are already in place
for j in range(0, n - i - 1):
# 与相邻元素比较,不对就交换
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
if __name__ == '__main__':
arr = [64, 34, 25, 12, 22, 11, 90]
bubbleSort(arr)
print("排序后的数组:")
for i in range(len(arr)):
print("%d" % arr[i]),
时间复杂度为O(
)
交换排序 ——
快速排序
基本思想:
将数据划分为两部分,左边的所有元素都小于右边的所有元素;然后,对左右两边进行快速排序。
划分方法:
选定一个参考点(
中间元素
),所有元素与之相比较,小的放左边,大的放右边。
具体划分方法:
选择第一个元素作为中间元素。
划分:
(1)先保存该元素的值到其它位置,腾出其空间。
(2)从后往前搜索一个比中间数小的元素,并将其放置到前面的这个空位上。
(3)从前往后搜索一个比中间数大的元素,并将其放置到后面的这个位置上。
重复(2),(3),直到两边搜索的空位重合
,
此时将中间元素放在该空位中。
数组快速排序过程演示
快速排序的应用
将一组数奇偶分开
不利用全部排序而求出数组中第10
个元素
def partition(L, left, right):
pivotkey = L[left]
while left < right:
# 从右到左,数出小于 pivotkey 的,放左边
while left < right and L[right] >= pivotkey:
right -= 1
L[left] = L[right]
# 从左到右,数出大于 pivotkey 的,放右边。
while left < right and L[left] <= pivotkey:
left += 1
L[right] = L[left]
# 最后剩下的那个空位置放 pivotkey
L[left] = pivotkey
return left
# arr[] --> 排序数组
# low --> 起始索引
# high --> 结束索引
# 快速排序函数
def quickSort(arr, low, high):
if low < high:
pi = partition(arr, low, high)
quickSort(arr, low, pi - 1)
quickSort(arr, pi + 1, high)
if __name__ == '__main__':
arr = [10, 7, 8, 9, 13, 5]
n = len(arr)
quickSort(arr, 0, n - 1)
print("排序后的数组:")
for i in range(n):
print("%d" % arr[i])