基础的算法与数据结构

冒泡排序: 左右比较互换

def select_sort(li):
    lg=len(li)-1
    for i in range(lg):
        flag = False
        for j in range(lg):
            if li[j] > li[j+1]:
                li[j+1],li[j] = li[j],li[j+1]
                flag = True
        if not flag:
            return
select_sort(li)
print(li)


选择排序  每次循环取最左边的为最小值去比较

def select_sort(li):
    lg = len(li)-1
    for i in range(lg):
        emp = i
        for j in range(i+1,lg+1):
            if li[j] <= li[emp]:
                emp = j
        if emp != i:
            li[i],li[emp] = li[emp],li[i]
select_sort(li)
print(li)


 插入排序  原始列表里分为有序和无序,每次从无序区里拿一个元素插入到有序区里

def select_sort(li):
    lg = len(li)-1
    for  i in range(1,lg):
        tmp = li[i]
        j = i-1
        while j>= 0 and tmp<li[j]:
            li[j+1] = li[j]
            j = j-1
        li[j+1] = tmp

select_sort(li)
print(li)


快排 取一个元素p,使其归位,左边的比起小,最右边的比其大,递归完成排序


def quick_sort(li,left,right):
    if left<right:
        mid = partition(li,left,right)
        quick_sort(li,left,mid-1)
        quick_sort(li,mid+1,right)

def partition(li,left,right):
    tmp = li[left]
    while left<right:
        while li[right] >= tmp and left<right:
            right -= 1
        li[left] = li[right]

        while li[left] <= tmp and left<right:
            left+= 1
        li[right] = li[left]
    li[left] = tmp
    return left

quick_sort(li,0,len(li)-1)
print(li)



归并排序  先分组为有序的单个列表,在合并(依赖另外一个列表实现),与中间的索引比较

def merget_sort(li,left,right):
    if left < right:
        mid = (left+right) // 2
        merget_sort(li,left,mid)
        merget_sort(li,mid+1,right)
        merget(li,left,mid,right)

def merget(li,left,mid,right):
    i = left
    j = mid+1
    ltmp = []
    while i <= mid and j <= right:
        if li[i] <= li[j]:
            ltmp.append(li[i])
            i+=1
        else:
            ltmp.append(li[j])
            j += 1

    # 右边没值了
    while i <= mid:
        ltmp.append(li[i])
        i+=1

    # 左边没值 了
    while j<= right:
        ltmp.append(li[j])
        j+=1
    # 重新赋值给列表
    li[left:right+1] = ltmp

merget_sort(li,0,len(li)-1)
print(li)

计数排序   很妙,去其索引给另外的列表,在取出来给自身
def count_sort(li,max_num):
count = [0 for i in range(max_num+1)]
for num in li:
count[num] += 1
i = 0
for num, m in enumerate(count):
for j in range(m):
li[i] = num
i += 1
count_sort(li,max(li))
print(li)


其他的数据结构参考:https://lupython.gitee.io/2017/04/05/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%92%8C%E7%AE%97%E6%B3%95%E6%A6%82%E8%BF%B0/#%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%9A%84%E5%AE%9A%E4%B9%89

原文地址:https://www.cnblogs.com/changwenjun-666/p/11592925.html