数据结构_排序(python)

1、快速排序

"""
挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,
递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序
"""
import sys
sys.setrecursionlimit(1000000)

def fastSort(alist, first, last):
    # 定义递归条件
    if first < last:
        mid = alist[first]
        left = first
        right = last
        
        # 定义拆分条件
        while left < right:
            # 往右侧推进
            while right > left and alist[right] >= mid:
                right -= 1
            # right小于 mid值,left 标签设置为right标签元素
            alist[left] = alist[right]
            
            # 往左侧推进
            while left < right and alist[left] < mid:
                left += 1
            alist[right] = alist[left]
        
        # 获取中间值
        alist[left] = mid

        # 对切割后左边的子部分进行快速排序
        fastSort(alist, first, left-1)
        # 对切割后右边的子部分进行快速排序
        fastSort(alist,left+1, last)
        return alist


test_list1 = [30,24,5,58,18,36,12,42,39]
test_list2 = [54,33,77,6, 44, 17, 77, 31,17, 93, 55]
result = fastSort(test_list2, 0, len(test_list2)-1)
print(result)

# 输出结果
# [6, 17, 17, 31, 33, 44, 54, 55, 77, 77, 93]

2、冒泡排序

"""
1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3. 针对所有的元素重复以上的步骤,除了最后一个。
4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
"""
import random
def bubble_sort(alist):
    # 获取列表元素的总数量
    n = len(alist)
    # 冒泡排序的循环范围
    for j in range(n-1, 0, -1):       
        count = 0
        for i in range(j):
            if alist[i] > alist[i+1]:
                alist[i], alist[i+1] = alist[i+1], alist[i]
                count += 1
                
        if count == 0:
            break

if __name__ == "__main__":
    li = list(range(5))
    random.shuffle(li)
    print('排序前:{}'.format(li))
    bubble_sort(li)
    print('排序后:{}'.format(li))

# 输出
# 排序前:[2, 0, 1, 3, 4]
# 排序后:[0, 1, 2, 3, 4]

3、选择排序

def selection_sort(alist): 
    # 当前列表的长度 
    n = len(alist) 
    # 定义外围循环次数 
    for j in range(n - 1): 
        # 定义min_index的初始值为j 
        min_index = j 
        # cur的下标移动范围 
        for i in range(j + 1, n): 
        # 找到最小元素 
            if alist[i] < alist[min_index]: 
                min_index = i 
            # mix标签元素和无序队列首位置元素替换 
            if min_index != j: 
                alist[j], alist[min_index] = alist[min_index], alist[j]

    return alist

4、插入排序

def insert_sort(alist): 
    # 无序队列元素数量 
    n = len(alist) 
    # 有序队列循环的次数 
    for i in range(0, n): 
        # 比较循环次数的确定 
        for j in range(i, 0, -1): 
            # 假设26的下标是j,那么54的下标为j-1 
            if alist[j] < alist[j - 1]: 
                # 大小数值元素进行替换 
                alist[j], alist[j - 1] = alist[j - 1], alist[j] 
        # 否则的话,大小元素不替换 
        else: 
            break
    return alist

猜你喜欢

转载自www.cnblogs.com/clpy/p/12934616.html