Live2D

python实现排序算法

冒泡排序(Bubble Sort)

"""
冒泡排序:让子序列中的最大元素不断沉底,达到排序的目的。
冒泡排序一共经过N-1次遍历,其中第i次遍历前N-i个元素(第i+1到N个元素已经排序完毕),将第i大的元素移动到N-i的位置
"""
lists = [2, 4, 1, 3, 0, 100, 23, 60]

for i in range(len(lists) - 1):
    for j in range(0, len(lists) - i - 1):
        lists[j], lists[j + 1] = min(lists[j], lists[j + 1]), max(lists[j], lists[j + 1])

# 优化
# 如果进行某一趟排序时并没有进行数据交换,则说明所有数据已经有序,可立即结束排序,避免不必要的比较过程

for i in range(len(lists) - 1):
    flag = False
    for j in range(len(lists) - 1 ,i,-1):
        if lists[j] < lists[j - 1]:
            flag = True
            lists[j],lists[j-1] = lists[j-1],lists[j]
    if not flag:
        break

print(lists)

选择排序(Selection Sort)

# 选择排序,每次选择一个最小的放在当前未排序序列的首位
lists = [2, 4, 1, 3, 0, 100, 23, 60]

def selection_sort(li):

    for i in range(len(li)):
        index = li.index(min(li[i:])) # 存储最小元素的位置,否则再次查找列表已经改变
        li[i], li[index] = li[index],li[i]
    print(li)


selection_sort(lists)

插入排序(Insertion Sort)

插入排序

# 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

arr = [1, 12, 2, 11, 13, 5, 6, 18, 4, 9, -5, 3, 11]

def insertsort(arr):
    for i in range(1, len(arr)):
        j = i
        while j > 0:
            if arr[j] < arr[j - 1]:
                arr[j], arr[j - 1] = arr[j - 1], arr[j]
            j -= 1
    return arr


print(insertsort(arr))

快速排序(Quick Sort)

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。
步骤为:
挑选基准值:从数列中挑出一个元素,称为"基准"(pivot);
分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成;
递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。
arrx = [1, 12, 2, 11, 13, 5, 6, 18, 4, 2,9, -5, 3, 11]


def quick_sort(arr):
    if len(arr) < 2:
        return arr
    else:
        pivot = arr[0]
        small_arr = [i for i in arr[1:] if i < pivot]
        big_arr = [i for i in arr[1:] if i >= pivot]
        return quick_sort(small_arr) + [pivot] + quick_sort(big_arr)


print(quick_sort(arrx))

  



posted @ 2019-08-17 10:37  穆梓先生  阅读(284)  评论(0编辑  收藏  举报
$(function(){ $('#returnTop').click(function () { $('html,body').animate({ scrollTop: '0px' }, 800); returnfalse; }); });