1.冒泡排序
算法步骤
相邻的元素之间对比,每次早出最大值或最小值放到最后或前面,所以形象的称为冒泡。
特点
n个数排序则进行n轮,每轮比较n-i次。所以时间复杂度为O(n^2),空间复杂度为O(1),该排序算法稳定。
代码模板
n = int(input())
a = list(map(int, input().split()))
for i in range(1, n-1):
for j in range(0, n - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
print(' '.join(map(str, a)))
2.选择排序
算法步骤
从左往右找到最小元素,放在起始位置。依次找到第i个位置的元素。
特点
n个数排序有n个位置,每轮比较n-i次。所以时间复杂度为O(n^2),空间复杂度为O(1),该排序算法稳定。
代码模板
n = int(input())
a = list(map(int, input().split()))
for i in range(0, n-1):
min_val = a[i]
min_id = i
for j in range(i, n):
if a[j] < min_val:
min_val = a[j]
min_id = j
a[i], a[min_id] = a[min_id], a[i]
print(' '.join(map(str, a)))
3.插入排序
算法步骤
第一个元素看做已排序,从左往右遍历每一个元素。在已排序元素中从后往前扫描:如果当前元素大于新元素,则钙元素移动到后一位。
简单来说,对第i个元素从i向左到i-1找合适的位置插入。
特点
n个数排序则进行n轮插入,每轮比较i次。所以时间复杂度为O(n^2),空间复杂度为O(1),该排序算法不稳定。
代码模板
n = int(input())
a = list(map(int, input().split()))
for i in range(1, n):
value = a[i]
insert_id = 0
for j in range(i - 1, -1, -1):
if a[j] > value:
a[j + 1] = a[j]
else:
insert_id = j + 1
break
a[insert_id] = value
print(' '.join(map(str, a)))
4.快速排序
算法步骤
找一个基准值x,把列表分为三部分:小于等于x的数、x、大于x的数字。左部分和右部分递归使用该策略。
特点
时间复杂度为O(n log(n)),空间复杂度为O(n log(n)),该排序算法不稳定。
代码模板
def partition(a, left, right):
id = left + 1
for i in range(left + 1, right + 1):
if a[i] <= a[left]:
a[id], a[i] = a[i], a[id]
id += 1
a[left], a[id - 1] = a[id - 1], a[left]
return id - 1
def quicksort(a, left, right):
if left < right:
mid = partition(a, left, right)
quicksort(a, left, mid - 1)
quicksort(a, mid + 1, right)
n = int(input())
a = list(map(int, input().split()))
quicksort(a, 0 , n - 1)
print(' '.join(map(str, a)))
5.归并排序
算法步骤
先把数组分成两部分,每部分递归处理变成有序,将两个有序列表合并起来。
代码模板
n = int(input())
a = list(map(int, input().split()))
def merge(A,B):
result = []
while len(A)!=0 and len(B)!=0:
if A[0] <= B[0]:
result.append(A.pop(0))
else:
result.append(B.pop(0))
result.extend(A)
result.extend(B)
return result
def mergesort(A):
if len(A)<2:
return A
mid = len(A)//2
left =mergesort(A[:mid])
right = mergesort(A[mid:])
return merge(left, right)
print(' '.join(map(str, mergesort(a))))
6.桶排序
算法步骤
利用函数映射关系,将输入数据分到有限的桶里,然后每个通分别排序:
(1)初始化k个桶
(2)遍历数据,将数据放入到对应桶中
(3)每个桶单独排序
(4)各个桶的数据拼接起来