快速排序

快排又被称为分治法。其主要思想分为三步:

1.从待排序数列中取出一个数作为基准数

2.一次排序,将大于基准数的数放在基准数右边,小于基准数的放在基准数左边

3.分别对一次排序后形成的左右区间重复步骤二,直到各区间只剩一个数

快速排序的时间复杂度

最好的时间复杂度为:

python快排源码 python快排工具_算法

最坏的时间复杂度为:

python快排源码 python快排工具_排序算法_02


python实现如下:

# 快排1
def quick_sort(lst,left,right):
    if left < right: # 至少两个或两个以上元素 则递归
        mid = partition(lst,left,right)
        quick_sort(lst,left,mid-1)
        quick_sort(lst,mid+1,right)

# 快排2
def partition(lst,left,right):
    tmp = lst[left]
    while left < right:
        while left < right and lst[right] >= tmp: # 从右边找比最左边tmp小的数
            right -= 1 # 没找到比它小的,向左走一位
        lst[left] = lst[right] # 把右边找到的比left小的数写到left空位上
        print(lst,'右边')
        while left < right and lst[left] <= tmp:
            left += 1
        lst[right] = lst[left] # 找到的话把左边找到的比left大的值写到右边空位上
        print(lst, '左边')
    lst[left] = tmp # 把 tmp 归位 写到共同的位置(left=right)上
    return left

收录了一种更为简单的快排算法

def quicksort(array):
    if len(array) < 2:
        return array
    else:
        pivot = array[0]
        less = [i for i in array[1:] if i <= pivot]
        greater = [i for i in array[1:] if i > pivot]
        return quicksort(less) + [pivot] + quicksort(greater)

冒泡排序

冒泡排序的名字很有趣,就如排序方式特点确实很符合它的名字,其主要思想分为四部:

1.从待排序列的开头开始遍历,依次比较两个相邻的元素,如果第一个元素大于第二个元素,就交换二者位置,反之无操作。

2.对数列中的每个元素除了最后一个依次重复以上步骤

3.一次遍历完成,将这时的数列取出最后一个元素作为新的数列重复步骤1、步骤2

4.遍历直到没有需要交换位置的数字为止

冒泡排序的时间复杂度

python快排源码 python快排工具_快排_03


python实现如下:

# 冒泡
def bubble_sort(lst):
    for i in range(len(lst)-1): # 第i趟
        exchange = False
        for j in range(len(lst)-i-1):
            if lst[j] > lst[j+1]: # 大于改为小于即为降序排列
                lst[j],lst[j+1] = lst[j+1],lst[j]
                exchange = True
        print(lst)
        if not exchange:
            return

同时也收录了较为简单的冒泡排序

def bubble_sort(arr):
    # 我个人理解这个是不用进行比较的个数,第一次是最后一个,第二次是倒数两个...
    for i in range(1, len(arr)):
        # 从第一个比第二个 比到 第n-1个比第n个 所以是range(0, len(arr)-i)
        for j in range(0, len(arr)-i):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr