Day32 算法之冒泡,选择,插入及快排

冒泡排序:

def bubble_sort(data):
    for i in range(len(data) - 1):
        flag = False #设置标识,如果有一轮循环没有发生任何交换,说明已经排序完成
        for j in range(len(data) - i - 1):
            if data[j] > data[j+1]:
                data[j], data[j+1] = data[j+1], data[j]
                flag = True #发生交换,就将标识设置为True
        if not flag: #没有发生交换,直接return
            return data
    return data

选择排序:

def choice_sort(data):
    for i in range(len(data) - 1):
        min = i #初始化最小的元素下标
        for j in range(i + 1, len(data)):
            if data[min] > data[j]:
                min = j #找到最小元素的下标
        data[i], data[min] = data[min], data[i] #交换
    return data

插入排序:

def insert_sort(data):
    for i in range(len(data)):
        tmp = data[i]
        j = i - 1
        while j >= 0 and data[j] > tmp: #找当前位置tmp前面的元素如果比tmp大,就将前面位置的元素覆盖到当前位置,并且继续往前走
            data[j+1] = data[j]
            j -= 1
        data[i] = tmp #直到不能往前走,将tmp覆盖到当前位置
    return data

快速排序:

def quick_sort(data, left, right):
    if left < right: #定义俩游标,最左边是left,最右边是right
        mid = partition(data, left, right) #调用一个函数返回元素列表第一个元素的归序位置
        quick_sort(data, left, mid - 1) #递归解决元素左右两边的排序
        quick_sort(data, mid + 1, right)


def partition(data, left, right):
    tmp = data[left]
    while left < right: # 只要左边游标和右边游标没有重合就要一直执行,直到左右重合,data[left]归序完成
        while left < right and data[right] >= tmp: #先从left最右边往左看,比tmp大,right往左走
            right -= 1
        data[left] = data[right] #不满足比tmp大,把该值覆盖到left指向位置
        while left < right and data[left] <= tmp: #从right左边往右看,比tmp小,left往右走
            left += 1
        data[right] = data[left] #不满足比tmp小,把该值覆盖到right指向位置
    data[left] = tmp #上面的循环结束,left和right指向同一位置,该位置就是data[left]应该放置的位置
    return left
posted @ 2017-03-17 10:38  摸个鱼儿  阅读(97)  评论(0编辑  收藏  举报