📅  最后修改于: 2023-12-03 15:10:10.289000             🧑  作者: Mango
排序和排名是编程中常见的问题。排序指的是按照一定的规则将一组数据按照升序或降序排列;而排名则是指对于已排序的数据集合,给每个元素设置一个排名。
冒泡排序是一种简单的排序算法。它的基本思想是通过多次交换相邻的元素,将较大的元素逐渐往后移动,从而达到排序的效果。冒泡排序的时间复杂度为O(n^2)。
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
快速排序是一种常用的排序算法,它的基本思想是通过一次排序将序列分成两个子序列,使得左边的序列全部小于右边的序列,然后递归地对左右两个子序列进行排序。快速排序的时间复杂度为O(nlogn)。
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr)//2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
归并排序是一种分治算法,它的基本思想是将待排序的序列拆分成若干个子序列,每个子序列分别进行排序,然后再通过归并操作将子序列合并成一个有序的序列。归并排序的时间复杂度为O(nlogn)。
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr)//2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(a, b):
res = []
i, j = 0, 0
while i < len(a) and j < len(b):
if a[i] < b[j]:
res.append(a[i])
i += 1
else:
res.append(b[j])
j += 1
res += a[i:]
res += b[j:]
return res
Naive算法是一种简单的排名算法。它的基本思想是对于每个元素,遍历整个数组并记录有多少个元素小于等于它。Naive算法的时间复杂度为O(n^2)。
def rank_naive(arr):
n = len(arr)
rank = []
for i in range(n):
cnt = 0
for j in range(n):
if arr[j] <= arr[i]:
cnt += 1
rank.append(cnt)
return rank
快速排序还可以用来求排名。对于每个元素,通过快速排序将数组中所有小于它的元素移动到它的左边,然后可以得到它的排名。快速排序求排名的时间复杂度为O(nlogn)。
def rank_quick_sort(arr):
n = len(arr)
rank = []
def partition(arr, l, r):
pivot = arr[l]
i, j = l, r
while i < j:
while i < j and arr[j] > pivot:
j -= 1
while i < j and arr[i] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i], arr[l] = arr[l], arr[i]
return i
def quick_sort(arr, l, r):
if l >= r:
return
index = partition(arr, l, r)
quick_sort(arr, l, index-1)
quick_sort(arr, index+1, r)
quick_sort(arr, 0, n-1)
for i in range(n):
cnt = 0
for j in range(i):
if arr[j] < arr[i]:
cnt += 1
rank.append(cnt)
return rank
排序和排名是编程中常见的问题。要求解这些问题,我们通常会用到各种排序算法和排名算法。在选择算法时,我们需要考虑时间复杂度和空间复杂度,并根据实际情况进行选择。同时,在实际应用中,我们也可以结合多种算法,以达到更好的效果。