基本排序算法(Python实现)

时间:2021-07-08 01:30:17

Python列表基本排序算法

1.选择排序

在每次循环中将剩下未排序的最小值交换到未排序的最前一位。

def selectionSort(lyst):
for i in range(0, len(lyst) - 1):
minIndex = i
for j in range(i + 1, len(lyst)):
if lyst[j] < lyst[minIndex]:
minIndex = j
lyst[i], lyst[minIndex] = lyst[minIndex], lyst[i]
return lyst

2.冒泡排序

两两比较,每次外循环中将最大的值取到最后一位。

def bubbleSort(lyst):
n = len(lyst)
while n > 1:
for i in range(0, n - 1):
if lyst[i] > lyst[i + 1]:
lyst[i], lyst[i + 1] = lyst[i + 1], lyst[i]
n -= 1
return lyst

3.插入排序

在每次循环时,将该项按顺序插入到前面若干项中的正确位置。这样在每次外循环结束时,前面均排序成功。(类似扑克牌的摆牌顺序,随着循环到新的位置,前面的数项均已排序完毕。)

def insertionSort(lyst):
for i in range(0, len(lyst)):
j = i - 1
itemToInsert = lyst[i]
while j >= 0:
if itemToInsert < lyst[j]:
lyst[j + 1] = lyst[j]
j -= 1
else:
break
lyst[j + 1] = itemToInsert
return lyst

更快的排序

1.快速排序

选取中点作为基准点进行分区,然后对分区迭代排序

def quickSort(lyst, left, right):
if left > right:
return lyst
mid = (left + right) // 2
# 将中点作为基准点,并与最右点交换位置
key = lyst[mid]
lyst[mid], lyst[right] = lyst[right], lyst[mid]
boundary = left # 以最左设置边界
# 将小于基准点的数都放置在边界左边
for index in range(left, right):
if lyst[index] < key:
lyst[index], lyst[boundary] = lyst[boundary], lyst[index]
boundary += 1
# 将基准点移至边界位置
lyst[boundary], lyst[right] = lyst[right], lyst[boundary]
quickSort(lyst, left, boundary - 1)
quickSort(lyst, boundary + 1, right)
return lyst

2.合并排序
将列表一分为二递归分成一个个的字列表,排序每个子列表并按正确排序存放在另一缓存列表中,每次循环排序后将缓存列表中的数对应位置写入当前列表。

def merge(lyst, left, mid, right, copyBuffer):
i1 = left
i2 = mid + 1
for i in range(left, right + 1):
if i1 > mid:
copyBuffer[i] = lyst[i2]
i2 += 1
elif i2 > right:
copyBuffer[i] = lyst[i1]
i1 += 1
elif lyst[i1] < lyst[i2]:
copyBuffer[i] = lyst[i1]
i1 += 1
else:
copyBuffer[i] = lyst[i2]
i2 += 1

for i in range(left,right+1):
lyst[i] = copyBuffer[i]


def mergeSortHelper(lyst, left, right, copyBuffer):
if left < right:
mid = (left + right) // 2
mergeSortHelper(lyst, left, mid, copyBuffer)
mergeSortHelper(lyst, mid + 1, right, copyBuffer)
merge(lyst, left, mid, right, copyBuffer)


def mergeSort(lyst):
copyBuffer = list(len(lyst) * " ")
mergeSortHelper(lyst, 0, len(lyst) - 1, copyBuffer)


lyst = [4,1,7,6,5,3,8,2]
mergeSort(lyst)