最全排序算法汇总(Python)

本文全面总结了Python中常见的排序算法,包括冒泡排序、选择排序、插入排序、快速排序、归并排序等,并通过实例代码详细讲解每种排序算法的工作原理和实现方式,帮助读者深入理解数据结构和算法。
摘要由CSDN通过智能技术生成
# import time
#
# 1、冒泡排序
# def BubbleSort(arr):
# 	for i in range(1,len(arr)):
# 		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

# 1.1、冒泡排序优化1
# def bubbleSort_improveV1(arr):
#     for i in range(1,len(arr)):
#         flag = True
#         for j in range(0,len(arr)-i):
#             if arr[j]>arr[j+1]:
#                 arr[j],arr[j+1]=arr[j+1],arr[j]
#                 flag=False
#         if flag:
#             break
#     return arr

# 1.2、冒泡排序优化2
# def bubbleSort_improveV2(arr):
#     last_change_index=0 #记录最后一次交换的位置
#     # 无序数列的边界,每次只需要比较到此处就可以了,因为之后都是有序数据
#     sort_border=len(arr)-1
#     for i in range(0,len(arr)):
#         flag=True
#         for j in range(0,sort_border):
#             if arr[j]>arr[j+1]:
#                 arr[j],arr[j+1]=arr[j+1],arr[j]
#                 flag=False
#                 last_change_index=j
#         sort_border=last_change_index
#         if flag:
#             break
#     return arr

# 1.3、鸡尾酒排序,也是属于冒泡排序的一种改进方法
# def cock_tail_sort(arr=[]):
#     for i in range(len(arr)//2):
#         # 有序标记,初始为True
#         flag=True
#         # 奇数轮,从左向右比较和交换
#         for j in range(i,len(arr)-1-i):
#             if arr[j]>arr[j+1]:
#                 arr[j+1],arr[j]=arr[j],arr[j+1]
#                 flag=False
#         if flag:
#             break
#         # 偶数轮开始之前,要重新标记为True
#         flag=True
#         # 偶数轮
#         for k in range(len(arr)-i-1,i,-1):
#             if arr[k]<arr[k-1]:
#                 arr[k],arr[k-1]=arr[k-1],arr[k]
#                 flag=False
#         if flag:
#             break
#     return arr


# 2、选择排序
# def SelectionSort(arr):
#     for i in range(len(arr)-1): #最后一个数据不用再参与循环,因为只剩它一个,它肯定就是未排序序列中最小的
#         minIndex=i
#         for j in range(i+1,len(arr)):
#             if arr[minIndex] > arr[j]:
#                 minIndex=j
#         if i!=minIndex:
#             arr[i],arr[minIndex]=arr[minIndex],arr[i]
#     return arr


# 3、插入排序
# def InsertionSort(arr):
#     for i in range(len(arr)):
#         perIndex=i-1
#         current=arr[i]
#         while perIndex>=0 and arr[perIndex]>current:
#             arr[perIndex+1]=arr[perIndex]
#             perIndex -= 1
#         arr[perIndex+1]=current
#     return arr


# 4、希尔排序
# def shellSort(arr):
#     import math
#     gap=1
#     while(gap<len(arr)/3):  # 初始化一个gap
#         gap=gap*3+1
#
#     while gap>0:
#         for i in range(gap,len(arr)):
#             temp=arr[i]
#             j=i-gap
#             while j>=0 and arr[j]>temp:
#                 arr[j+gap]=arr[j]
#                 j -= gap
#             arr[j+gap]=temp
#         gap=math.floor(gap/3)
#     return arr


# 5、归并排序
# def mergeSort(arr):
#     import math
#     if(len(arr)<2):
#         return arr
#     middle=math.floor(len(arr)/2) #math.floor()返回数字的下舍整数,如3.2,返回3
#     left,right=arr[0:middle],arr[middle:] #切片是一个左闭右开的区间,不包括右边的下标
#     return merge(mergeSort(left),mergeSort(right))
#
# def merge(left,right):
#     result=[]
#     while left and right:
#         if left[0] < right[0]:
#             result.append(left.pop(0))
#         else:
#             result.append(right.pop(0))
#     while left:
#         result.append(left.pop(0))
#     while right:
#         result.append(right.pop(0))
#     return result


# 6、快速排序
# def quickSort(arr=[],left=None,right=None):
#     left=0 if not isinstance(left,(int,float)) else left
#     right=len(arr)-1 if not isinstance(right,(int,float)) else right
#     if left>=right:
#         return
#     pivot_index=partition_V3(arr,left,right)
#     quickSort(arr,left,pivot_index-1)
#     quickSort(arr,pivot_index+1,right)
# 快排分割方法1
# def partition_V1(arr,star_index,end_index):
#     pivot=arr[star_index]
#     left=star_index
#     right=end_index
#     while left<right:
#         while(left<right and arr[right]>pivot):
#             right-=1
#         if left<right:
#             arr[left]=arr[right]
#             left += 1
#         while(left<right and arr[left]<=pivot):
#             left+=1
#         if left<right:
#             arr[right]=arr[left]
#             right-=1
#     arr[left]=pivot
#     return left
# 快排分割方法2
# def partition_V2(arr, star_index, end_index):
#     pivot = arr[star_index]
#     left = star_index
#     right = end_index
#     while left != right:
#         while left < right and arr[right] > pivot:
#             right -= 1
#         while left < right and arr[left] <= pivot:
#             left += 1
#         if left < right:
#             arr[left], arr[right] = arr[right], arr[left]
#     arr[star_index] = arr[left]
#     arr[left] = pivot
#     return left
# 快排分割方法3
# def partition_V3(arr,star_index,end_index):
#     pivot=arr[star_index]
#     mark=star_index
#     for i in range(star_index+1,end_index+1):
#         if arr[i]<pivot:
#             mark += 1
#             arr[i],arr[mark]=arr[mark],arr[i]
#     arr[star_index]=arr[mark]
#     arr[mark]=pivot
#     return mark


# 7、堆排序
# def heapSort(arr=[]):
#     build_heap(arr)
#     for i in range(len(arr)-1,0,-1):
#         arr[i],arr[0]=arr[0],arr[i]
#         down_adjust(0,i,arr)
#     return arr
#
# def build_heap(arr):
#     '''
#     把无序数据构建为一个最大堆
#     '''
#     for i in range((len(arr)-2)//2,-1,-1):
#         down_adjust(i,len(arr),arr)
#
# def down_adjust(parent_index,length,arr=[]):
#     temp=arr[parent_index]
#     child_index=parent_index*2+1
#     while child_index<length:
#         if child_index+1<length and arr[child_index]<arr[child_index+1]:
#             child_index += 1
#         if temp>=arr[child_index]:
#             break
#         arr[parent_index]=arr[child_index]
#         parent_index=child_index
#         child_index=2*parent_index+1
#     arr[parent_index]=temp

# 8、计数排序
# def countSort(arr=[]):
#     max_value=max(arr) # 获取列表最大值
#     # 根据最大值确定数组的长度,如果最大值是8,则数组的长度要为9,即[0,8]
#     count_array=[0]*(max_value+1)
#     for i in range(0,len(arr)):
#         count_array[arr[i]] += 1 # 遍历数列,填充数组
#     # 遍历数组,输出结果
#     sorted_array=[] # 存放已经排好序的数列
#     for i in range(0,len(count_array)):
#         for j in range(0,count_array[i]):
#             sorted_array.append(i)
#     return sorted_array

# 8.1、计数排序优化
# def countSort_improve(arr=[]):
#     max_value=max(arr)
#     min_value=min(arr)
#     countarray_Length=max_value-min_value+1
#     # 当列表中的元素不是按顺序append进列表,而是根据下标赋值时,必须要对列表进行初始化
#     count_array=[0]*countarray_Length
#     for i in range(len(arr)):
#         count_array[arr[i]-min_value] += 1
#     for i in range(1,len(count_array)):
#         count_array[i]=count_array[i]+count_array[i-1]
#     sorted_array=[0]*len(arr)
#     for i in range(len(arr)-1,-1,-1):
#         sorted_array[count_array[arr[i]-min_value]-1]=arr[i]
#         count_array[arr[i]-min_value] -= 1
#     return sorted_array


# 9、桶排序
# def bucketSort(arr=[]):
#     max_value=max(arr)
#     min_value=min(arr)
#     d=max_value-min_value
#     bucket_num=len(arr)
#     # 区间跨度=(最大值-最小值)/(桶的数量-1)
#     bucket_range=d/(bucket_num-1)
#
#     # 初始化桶
#     # 创建的是一个列表的列表,所有桶都存放在bucket_list中,每个桶都是一个列表
#     # bucket_list=[[]]*bucket_num # 这样写不对,应用如下方法初始化桶
#     bucket_list=[]
#     for i in range(0,bucket_num):
#         bucket_list.append([])
#
#     # 遍历原始数组,将每个元素放入桶中
#     for i in range(0,len(arr)):
#         bucket_id=int((arr[i]-min_value)/bucket_range) # 求出当前元素应该放入哪个桶中
#         bucket=bucket_list[bucket_id]
#         bucket.append(arr[i]) # 把当前元素存入对应的桶中
#     for i in range(0,len(bucket_list)):
#         bucket_list[i].sort() # 对每一个桶中的元素进行排序,在这里直接调用了sort()
#
#     sorted_array=[]
#     for sub_list in bucket_list:
#         for element in sub_list:
#             sorted_array.append(element)
#     return sorted_array


# 10、基数排序
def RadixSort(arr=[]):
    i=0
    n=1
    max_value=max(arr)
    # 得到最大位数
    while max_value>10**n:
        n+=1
    while i<n: # 最大数有多少位就进行多少次循环
        bucket={} # 用字典构建桶
        for x in range(10):
            bucket.setdefault(x,[]) # setdefault()函数,如果键不存在于字典中,将会添加键并将值设为默认值。
        for x in arr: # 对每一位数进行排序
            radix=int((x/(10**i))%10) # 得到每位数的基数
            bucket[radix].append(x)
        # 把桶中的数据从第一个桶开始依次放入原始列表中
        j=0 # 原始列表计数变量
        for k in range(10):
            if len(bucket[k])!=0:
                for y in bucket[k]:
                    arr[j]=y
                    j += 1
        i+=1
    return arr

if __name__=='__main__':
    array = [3, 44, 38, 5, 15, 36, 46, 2, 48, 19]
    print(RadixSort(array))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值