设置一个vip隐私,夹杂一些碎碎念......涉及到一些转自其他佬的题解
39.排序
sort方法不实行;其他主要是时间上的限制--超时(多种排序法都不行)
基数排序
可以实现//没理解四个循环flag/(ㄒoㄒ)/
def radix_sort():
global a, n
exp = 1
max_num = max(a)
tmp = [0] * len(a)
while max_num // exp > 0:
bucket = [0] * 10
for i in range(n): bucket[(a[i] // exp) % 10] += 1
for i in range(1, 10): bucket[i] += bucket[i-1]
for i in range(n-1, -1, -1):
k = (a[i] // exp) % 10
tmp[bucket[k]-1] = a[i]
bucket[k] -= 1
for i in range(n): a[i] = tmp[i]
exp *= 10
n = int(input())
a = list(map(int, input().split()))
radix_sort()
for i in range(n): print(a[i], end=" ")
另一种--基数
def RedixSort(a):
base = 1
maxv = max(a)
while base < maxv:
bucket = []
for idx in range(10):
bucket.append([])
for num in a:
idx = num // base % 10 #对于原列表的每个元素,根据它的当前数位放到对应的桶中
bucket[idx].append(num)
l = 0
for idx in range(10): ##遍历每个桶,按顺序将塞回原列表
for v in buckrt[idx]:
a[l] = v
l += 1
print(a)
base *= 10
a = [1,2,5,5]
RadixSort(a)
快速排序
flag
def qsort(L, R):
i, j = L, R
key = a[(L + R) // 2]
while i <= j:
while a[i] < key: i += 1
while a[j] > key: j -= 1
if i <= j:
a[i], a[j] = a[j], a[i]
i += 1
j -= 1
if j > L: qsort(L, j)
if i < R: qsort(i, R)
n = int(input())
a = list(map(int, input().split()))
qsort(0,n-1)
for i in range(n): print(a[i], end=" ")
另一种--快速
def QucikSortPivot(a, start, end):
pivot = start
j = start + 1
for i in range(start+1, end+1):
if a[i] <= a[pivot]:
a[i], a[j] = a[j], a[i]
j += 1
a[pivot], a[j-1] = a[j-1], a[pivot]
pivot = j - 1
print(a[pivot], a[start:pivot], a[pivot+1:end+1])
return pivot
def QuickSort(a, start, end):
if start >= end:
return
pivot = QuickSortPivot(a, start, end)
QuickSort(a, start, pivot - 1)
QuickSort(a, pivot + 1, end)
a = [4,5,5,4]
QuickSort(a,0,3)
print(a)
归并排序
flag
def Merge(L, mid, R):
global a, b
i=L
j = mid+1
t=0
while(i <= mid and j <= R):
if(a[i] > a[j]):
b[t] = a[j]
j += 1
else:
b[t] = a[i]
i += 1
t += 1
while(i <= mid):
b[t] = a[i]
i += 1
t += 1
while(j <= R):
b[t] = a[j]
j += 1
t += 1
for i in range(t): a[L+i] = b[i]
def Mergesort(L, R):
if L < R:
mid = (L+R)//2
Mergesort(L, mid)
Mergesort(mid+1, R)
Merge(L, mid, R)
n = int(input())
a = list(map(int, input().split()))
b = [0] * len(a)
Mergesort(0,n-1)
for i in range(n): print(a[i], end=" ")
另一种--归并
#合并函数
#有个先决条件--a列表的start到mid的元素以及mid+1到end元素以及满足递增
#执行完次元素,a列表的start到end也能按照递增顺序排序
def Merge(a, strat, mid, end):
tmp = []
l = start
r = mid +1
while l <= mid and r <= end:
if a[l] <= a[r]:
tmp.append(a[l])
l += 1
else:
tmp.append(a[r])
r += 1
tmp.extend(a[l:mid+1])
tmp.extend(a[r:end+1])
for i in r