排序-五种排序
一、冒泡排序
代码示例
# 将乱序列表中最大元素排列到列表末尾位置
def m_sort(alist):
for j in range(0, len(alist) - 1):
if alist[j] > alist[j + 1]:
temp = alist[j]
alist[j] = alist[j + 1]
alist[j + 1] = temp
return alist
# 完整的冒泡排序
def m_sort_final(alist):
for i in range(0, len(alist) - 1):
for j in range(0, len(alist) - i - 1):
if alist[j] > alist[j + 1]:
temp = alist[j]
alist[j] = alist[j + 1]
alist[j + 1] = temp
return alist
二、选择排序
代码示例
def selectionSort(alist):
for i in range(len(alist) - 1, 0, -1):
positionOfMax = 0
for location in range(1, i + 1):
if alist[location] > alist[positionOfMax]:
positionOfMax = location
temp = alist[i]
alist[i] = alist[positionOfMax]
alist[positionOfMax] = temp
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
selectionSort(alist)
print(alist)
说明
选择排序通过减少交换次数来优化冒泡排序,通常在基准测试中表现更好。
三、插入排序
代码示例
# 完整的插入排序
def sort(alist):
for i in range(1, len(alist)):
while i > 0:
if alist[i] < alist[i - 1]:
alist[i], alist[i - 1] = alist[i - 1], alist[i]
i -= 1
else:
break
return alist
说明
插入排序的主要思想是每次取一个元素,将其插入到已排序部分的合适位置。
四、希尔排序
代码示例
# 希尔排序
def sort(alist):
gap = len(alist) // 2
while gap >= 1:
for i in range(gap, len(alist)):
while i > 0:
if alist[i] < alist[i - gap]:
alist[i], alist[i - gap] = alist[i - gap], alist[i]
i -= gap
else:
break
gap //= 2
return alist
说明
希尔排序是插入排序的改进版本,通过设置增量(gap)对子序列进行排序,逐步缩小增量,最终完成排序。
五、归并排序
代码示例
def merge_sort(alist):
n = len(alist)
if n <= 1:
return alist
mid = n // 2
left_li = merge_sort(alist[:mid])
right_li = merge_sort(alist[mid:])
left_pointer, right_pointer = 0, 0
result = []
while left_pointer < len(left_li) and right_pointer < len(right_li):
if left_li[left_pointer] < right_li[right_pointer]:
result.append(left_li[left_pointer])
left_pointer += 1
else:
result.append(right_li[right_pointer])
right_pointer += 1
result += left_li[left_pointer:]
result += right_li[right_pointer:]
return result
alist = [3, 8, 5, 7, 6]
print(merge_sort(alist))
说明
归并排序采用分治法,将列表不断分割为更小的子列表,然后逐步合并为有序列表。
六、快速排序
代码示例
# 快速排序
def sort(alist, start, end):
low = start
high = end
if low > high:
return
mid = alist[low]
while low < high:
while low < high:
if alist[high] > mid:
high -= 1
else:
alist[low] = alist[high]
break
while low < high:
if alist[low] < mid:
low += 1
else:
alist[high] = alist[low]
break
if low == high:
alist[low] = mid
break
sort(alist, start, high - 1)
sort(alist, low + 1, end)
return alist
# 测试代码
alist = [3, 8, 5, 7, 6]
sort(alist, 0, len(alist) - 1)
print(alist)
说明
快速排序通过选择基准值,将列表分为两部分,递归地对左右两部分进行排序。