基本排序算法(Python实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/okm6666/article/details/79247913

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)

猜你喜欢

转载自blog.csdn.net/okm6666/article/details/79247913