快速排序
找一个基准值x(默认是第一个值),把列表分成三部分:小于等于x的数字,x,大于x的数字左半部分和右半部分递归使用该策略
例: a=【3,5,8,1,2,9,4,7,6】
找到基准值3,【1,2】3 【5,8,9,4,7,6】左半部分【1,2】作为一个子问题求解;
右半部分【5,8,9,4,7,6】作为一个子问题求解。
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 left<right and li[right]>=tmp:right-=1 # 往左走一步li[left]=li[right] # 右边的值写到左边空位上while left<right and li[left]<=tmp:left+=1li[right]=li[left] # 把左边的值写到右边空位li[left]=tmp # 把tmp归位return left # 返回mid值,left,right都行n=int(input())
a=list(map(int,input().split()))
quick_sort(a,0,n-1)
print(' '.join(map(str,a)))
归并排序
数据结构算法--5 归并排序-CSDN博客 非常详细解答
def merge(li, low, mid, high):i = lowj = mid + 1ltmp = []while i <= mid and j <= high: # 只要两边都有数if li[i] < li[j]:ltmp.append(li[i])i += 1else:ltmp.append(li[j])j += 1# 执行完上个while,肯定有一部分没数了while i <= mid:ltmp.append(li[i])i += 1while j <= high:ltmp.append(li[j])j += 1li[low:high + 1] = ltmpdef merge_sort(li, low, high): # 这里递归就是左右,最后左右一起if low < high: # 至少有两个元素,递归mid = (low + high) // 2merge_sort(li, low, mid) # 等其递归完成返回一个左侧有序列表merge_sort(li, mid + 1, high) # 等其递归完返回一个右侧有序列表merge(li, low, mid, high) # 将两个合并n = int(input())
a = list(map(int, input().split()))
merge_sort(a, 0, n - 1)
print(' '.join(map(str,a)))
桶排序
首先将元素分在不同的桶中,在对每个桶中的元素排序。
def buckt_sort(li, n=10, max_num=1000): # n为桶的个数buckets = [[] for _ in range(n)] # 创建桶for val in li:i = min(val // (max_num // n), n - 1) # max_num//n为每个桶内的容量,i表示val放到几号桶buckets[i].append(val) # 加入到i号桶# 保持桶内的顺序for j in range(len(buckets[i]) - 1, 0, -1): # 步数为-1,反向冒泡排序if buckets[i][j] < buckets[i][j - 1]:buckets[i][j], buckets[i][j - 1] = buckets[i][j - 1], buckets[i][j]else:breaksotr_list = []for buc in buckets: # buc为一个列表(每个桶),一维sotr_list.extend(buc)return sotr_listn = int(input())
a = list(map(int, input().split()))
a = buckt_sort(a)
print(' '.join(map(str, a)))