10 大基本排序 --python

1 冒泡:相邻的元素作比较


def bubble_sort(num):
    for i in range(1,len(num)-1):
        for j in range(len(num)-i):#后面的i个排序已完成了,不用再排了
            if num[j]>num[j+1]:
                num[j],num[j+1] = num[j+1],num[j]
    return num
nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]
bubble_sort(nums)


2 选择排序:每次从列表中选择一个最大的

def choose_sort(num):
    length = len(num)-1
    while length:
        index = length
        for j in range(length):
            if num[j]> num[index]:
                index = j
        num[length],num[index] = num[index],num[length]
        length -= 1
    return num
            
nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]
choose_sort(nums)

3 插入排序:有序的列表插入元素

def insert_sort(num):
    for i in  range(1,len(num)):
        for j in range(i):
            if num[i]< num[j]:
                num[i],num[j] = num[j],num[i]
    return num
            
nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]
insert_sort(nums)   

 4 希尔排序:增量为k的排序

def shell_sort(num):
    N = len(num)
    k = N//2
    while k>0:
        #从第k个元素开始,逐个对其所在组进行直接插入排序
        i = k
        while i < N:
            j = i-k
            tmp = num[i]
            while j >= 0 and num[j] > tmp:#插入排序
                num[j + k] = num[j]
                j -= k
            num[j+k] = tmp
            i += 1
        k //= 2
                
    return num
            
nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]
shell_sort(nums)      
        

 5 归并排序  分治策略

def merage_sort(nums):
    if len(nums) <= 1:
        return nums
    length = int(len(nums)//2)
    left = merage_sort(nums[:length])
    right= merage_sort(nums[length:])
    return Merge(left,right)
def Merge(left,right):
#     print("left:",left,"right",right)
    l,r = 0,0
    result = []
    
    while l < len(left) and r < len(right):
        if left[l] < right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    result += left[l:]
    result += right[r:]
#     print("result",result)
    return result
nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]
merage_sort(nums) 

6 快速排序  关键字排序  递归  反复使用分治,分治是一种思想,递归是一种手段

def quick_sort(num,start,end):
    left = start
    right = end
    while left >= right:
        return
    temp = num[left]
    while left < right:
        while temp <= num[right]:
            right -= 1
        num[left]=num[right]
        while left < right and num[left] <= temp:
            left += 1
        num[right]=num[left]
    num[left] = temp
    quick_sort(num,start,left-1)
    quick_sort(num,left+1,end)
    return num
            
nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]
left = 0
right = len(nums)-1
quick_sort(nums,left,right)  
            

7 堆排序

def maxhead_sort(num):
    #构建大顶堆
    for start in range((len(num)-2)//2,-1,-1):
        #从第一个非叶子结点从下至上,从右至左调整结构
        sitdown(num,start,len(num)-1)
        
    for end in range(len(num)-1,0,-1):
        #调整堆结构,交换堆顶元素与末尾元素,使末尾元素最大
        num[0],num[end] = num[end],num[start]
        #重新对堆进行调整
        sitdown(num,0,end-1)
    return num

def sitdown(num,start,end):
    root = start#取出当前元素
    while True:
        child = 2*root+1
        if child > end:
            break
        #如果左子节点小于右子节点,child指向右子节点
        if child+1 <= end and num[child] < num[child+1]:
            child += 1
        #如果子节点大于父节点,将子节点与父节点交换
        if num[root] < num[child]:
            num[root],num[child] = num[child],num[root]
            root = child
        else:
            break
nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]
merage_sort(nums) 

8 计数排序

def Count_sort(num):
    max_num = max(num)
    length = len(num)
    output = [0 for i in range(length)]
    count = [0 for i in range(max_num+1)]
    
    #统计每个元素的出现次数
    for j in num:
        count[j] = count[j]+1

    #对所有的计数累加
    for i in range(1,len(count)):
        count[i] = count[i] + count[i-1]
    print("count",count)
    
    for j in num:
        #直接把元素放在输出列表中
        output[count[j] - 1] = j
        count[j] = count[j] - 1
#         print("huhu",count)
    return output
nums = [2, 6, 8, 5, 1,5, 4, 9, 3, 7,11]
Count_sort(nums) 

9 桶排序 计数排序的映射关系

def Buket_Sort(num):
    buckets = [0] * ((max(num)-min(num))+ 1)
    for i in range(len(num)):
#         print(num[i]-min(num),num[i],min(num))
        buckets[num[i]-min(num)] += 1#遍历num,在桶相应位置累加值,没有出现则为0
    res = []
    print("buckets",buckets)
    for i in range(len(buckets)):
        if buckets[i] != 0:#如果不是空桶,则取出桶的数据
            res  += [i + min(num)] * buckets[i]
    return res
        
nums = [2, 6, 8, 5, 1,5, 4, 9, 3, 7,11]
Buket_Sort(nums)         

10  基数排序

def Radix_nums(num):
     #寻找序列中最大的数
    max_num = num[0]
    for i in range(1,len(num)):
        if max_num < num[i]:
            max_num = num[i]
    max_length = len(str(max_num))
    return max_length

#从低到高的第pos位数
def get_num_pos(num,pos):
    return (int(num/(10 ** (pos-1))))%10

def Radix_Sort(num):
   count = 10 * [None]#存放各个桶的数据统计个数
   bucket = len(num) * [None]#暂时存放的排序结果
   #从低位到高位依次循环执行
   for pos in range(1,Radix_nums(num)+1):
        #置空各个桶的数据
        for x in range(10):
            count[x]=0
        #统计当前该位的元素数目(个位、十位、百位)
        for x in range(0,len(num)):
            #统计各个桶将要放进去的元素个数
            j = get_num_pos(int(num[x]),pos)
            count[j] += 1
            
        #count[i]表示第i个桶的右边界的索引
        for x in range(1,10):
            count[x] += count[x-1]
        print(x,count)
        
        #将数据依次放入桶中
        for x in range(len(num)-1,-1,-1):
            #求出元素第k位的数字
            j = get_num_pos(num[x],pos)
#             print(num[x],pos,j)
            #放入对应的桶中,count[j]-1是第j个桶的右边索引
            bucket[count[j]-1] = num[x]
            #对应桶的装入数据索引-1
            count[j] -= 1
        #将已经分配好的数据再倒出,此时已是对应当前位数有序的表
        for x in range(0,len(num)):
            num[x] = bucket[x]
        print(num)
#         return num
nums = [2, 6, 88, 55, 1,5, 4, 91, 3, 7]
Radix_Sort(nums)          

参考文献:

https://blog.csdn.net/jiaoyangwm/article/details/81807774   代码

https://www.cnblogs.com/onepixel/p/7674659.html    图解+代码

https://www.cnblogs.com/chengxiao/p/6194356.html   

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你解答关于希尔排序的问题。希尔排序是插入排序的一种改进算法,也被称为“缩小增量排序”。它的基本思想是将待排序的序列按照一定的间隔分成若干个子序列,对每个子序列进行插入排序,然后逐步缩小间隔,直到间隔为1,最后对整个序列进行一次插入排序。 希尔排序的时间复杂度与间隔序列的选择有关,最坏时间复杂度为$O(n^2)$,平均时间复杂度为$O(n \log n)$。相比于插入排序,希尔排序的时间复杂度有了明显的提升,且其在实际应用中也表现得比插入排序好。 下面是希尔排序的示例代码: ```python def shell_sort(arr): n = len(arr) gap = n // 2 while gap > 0: for i in range(gap, n): temp = arr[i] j = i while j >= gap and arr[j - gap] > temp: arr[j] = arr[j - gap] j -= gap arr[j] = temp gap //= 2 return arr ``` 在这段代码中,我们首先定义了一个希尔排序的函数shell_sort,它接收一个列表arr作为参数,并返回好序的列表。在函数中,我们首先获取列表的长度n和初始的间隔gap,然后开始循环,直到间隔为1为止。在每次循环中,我们将列表按照间隔分成若干个子序列,对每个子序列进行插入排序,将子序列按照升序列。最后,我们将间隔除以2,继续循环直到间隔为1。 使用希尔排序对列表进行排序非常简单,只需要调用shell_sort函数即可。例如,我们可以这样调用函数: ```python arr = [5, 2, 8, 3, 1, 6] sorted_arr = shell_sort(arr) print(sorted_arr) ``` 这段代码会输出好序的列表[1, 2, 3, 5, 6, 8]。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值