排序
直接调用sort函数,注意key的选择
如果想要对两个或者多个层面进行排序,比如说一个二维数组[[1,2],[3,4]],可以把key设成tuple形式,比如说key=lambda x:(x[0],x[1]),默认升序排列,如果想要降序,可以直接在前面添个负号,或者把reverse设为True
如果考场上不允许用这个方法,建议用选择排序或者计数排序。
选择排序:
- 需要自己定义compare函数,对于常见的比大小排序,实际上这个compare函数就是lambda x,y:return x<y,如果x<y,函数返回True,就说明找到了最小值,那么就需要与未排好序的第一个元素进行交换。
- 常见模板:
Python
for i in range(n):
best_idx = i # 当前位置应该放的记录索引
for j in range(i + 1, n):
if compare(records[j], records[best_idx]):
best_idx = j
# 交换到正确位置
<div markdown="1" style="margin-top: -30px; font-size: 0.75em; opacity: 0.7;">
:material-circle-edit-outline: 约 224 个字 :fontawesome-solid-code: 43 行代码 :material-clock-time-two-outline: 预计阅读时间 2 分钟
</div>
records[i], records[best_idx] = records[best_idx], records[i]x
计数排序:
需要先找到数组中的最大元素,然后构建一个计数数组,长度为maxVal+1
Python
def relative_sort_array(arr1, arr2):
# 1. 找到 arr1 中的最大值以确定计数数组的大小
# 如果题目没有给出范围,也可以用哈希表(dict)
upper = max(arr1)
# 2. 统计 arr1 中每个元素的出现次数
frequency = [0] * (upper + 1)
for x in arr1:
frequency[x] += 1
res = []
# 3. 首先处理 arr2 中的元素
for x in arr2:
while frequency[x] > 0:
res.append(x)
frequency[x] -= 1
# 4. 处理未在 arr2 中出现过的元素
# 计数数组的下标本身就是升序的,直接遍历即可
for x in range(upper + 1):
while frequency[x] > 0:
res.append(x)
frequency[x] -= 1
return res
# 测试示例 1
arr1_1 = [2,3,1,3,2,4,6,7,9,2,19]
arr2_1 = [2,1,4,3,9,6]
print(f"示例 1 输出: {relative_sort_array(arr1_1, arr2_1)}")
# 测试示例 2
arr1_2 = [28,6,22,8,44,17]
arr2_2 = [22,28,8,6]
print(f"示例 2 输出: {relative_sort_array(arr1_2, arr2_2)}")