快速排序
找一个基准值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】作为一个子问题求解。
python
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+=1
li[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博客 非常详细解答
python
def merge(li, low, mid, high):
i = low
j = mid + 1
ltmp = []
while i <= mid and j <= high: # 只要两边都有数
if li[i] < li[j]:
ltmp.append(li[i])
i += 1
else:
ltmp.append(li[j])
j += 1
# 执行完上个while,肯定有一部分没数了
while i <= mid:
ltmp.append(li[i])
i += 1
while j <= high:
ltmp.append(li[j])
j += 1
li[low:high + 1] = ltmp
def merge_sort(li, low, high): # 这里递归就是左右,最后左右一起
if low < high: # 至少有两个元素,递归
mid = (low + high) // 2
merge_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)))
桶排序
首先将元素分在不同的桶中,在对每个桶中的元素排序。
python
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:
break
sotr_list = []
for buc in buckets: # buc为一个列表(每个桶),一维
sotr_list.extend(buc)
return sotr_list
n = int(input())
a = list(map(int, input().split()))
a = buckt_sort(a)
print(' '.join(map(str, a)))