七大排序算法和计数排序
发布人:shili8
发布时间:2025-03-01 01:52
阅读次数:0
**七大排序算法与计数排序**
排序是计算机科学中一个非常重要的概念,它涉及到将数据按一定顺序排列。有很多种不同的排序算法,每种算法都有其特点和应用场景。在本文中,我们将介绍七大排序算法(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序和基数排序)以及计数排序。
###1. 冒泡排序冒泡排序是一种简单的排序算法,它通过反复地遍历列表,相邻元素之间进行比较和交换,以达到排序的目的。冒泡排序的时间复杂度为 O(n^2),其中 n 是列表中的元素个数。
def bubble_sort(arr): """ 冒泡排序算法 Args: arr (list): 需要排序的列表 Returns: list: 排序后的列表 """ n = len(arr) for i in range(n-1): # 每轮比较两两相邻元素 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# 示例使用arr = [64,34,25,12,22,11,90] print("原始列表:", arr) print("排序后列表:", bubble_sort(arr))
###2.选择排序选择排序是一种简单的排序算法,它通过在每一轮中找出最小或最大元素,并将其放在对应位置,以达到排序的目的。选择排序的时间复杂度为 O(n^2)。
def selection_sort(arr): """ 选择排序算法 Args: arr (list): 需要排序的列表 Returns: list: 排序后的列表 """ n = len(arr) for i in range(n-1): # 每轮找出最小元素并将其放在对应位置 min_idx = i for j in range(i+1, n): if arr[j] < arr[min_idx]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] return arr# 示例使用arr = [64,34,25,12,22,11,90] print("原始列表:", arr) print("排序后列表:", selection_sort(arr))
###3. 插入排序插入排序是一种简单的排序算法,它通过将每个元素插入到已经排好序的列表中,以达到排序的目的。插入排序的时间复杂度为 O(n^2)。
def insertion_sort(arr): """ 插入排序算法 Args: arr (list): 需要排序的列表 Returns: list: 排序后的列表 """ n = len(arr) for i in range(1, n): key = arr[i] j = i-1 # 将元素插入到已经排好序的列表中 while j >=0 and arr[j] > key: arr[j+1] = arr[j] j -=1 arr[j+1] = key return arr# 示例使用arr = [64,34,25,12,22,11,90] print("原始列表:", arr) print("排序后列表:", insertion_sort(arr))
###4. 归并排序归并排序是一种分治法的排序算法,它通过将列表分成两半,然后分别对每半进行排序,并将它们合并起来,以达到排序的目的。归并排序的时间复杂度为 O(n log n)。
def merge_sort(arr): """ 归并排序算法 Args: arr (list): 需要排序的列表 Returns: list: 排序后的列表 """ 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(left, right): result = [] while left and right: if left[0] < right[0]: result.append(left.pop(0)) else: result.append(right.pop(0)) result.extend(left) result.extend(right) return result# 示例使用arr = [64,34,25,12,22,11,90] print("原始列表:", arr) print("排序后列表:", merge_sort(arr))
###5. 快速排序快速排序是一种分治法的排序算法,它通过选择一个元素作为基准点,然后将其他元素分成两半,分别小于或大于该基准点,以达到排序的目的。快速排序的时间复杂度为 O(n log n)。
def quick_sort(arr): """ 快速排序算法 Args: arr (list): 需要排序的列表 Returns: list: 排序后的列表 """ 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) # 示例使用arr = [64,34,25,12,22,11,90] print("原始列表:", arr) print("排序后列表:", quick_sort(arr))
###6. 堆排序堆排序是一种分治法的排序算法,它通过将列表建成一个最大堆,然后逐步地从堆中取出元素,并将其放在对应位置,以达到排序的目的。堆排序的时间复杂度为 O(n log n)。
def heapify(arr, n, i): largest = i left =2 * i +1 right =2 * i +2 if left < n and arr[left] > arr[largest]: largest = left if right < n and arr[right] > arr[largest]: largest = right if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) def heap_sort(arr): """ 堆排序算法 Args: arr (list): 需要排序的列表 Returns: list: 排序后的列表 """ n = len(arr) for i in range(n //2 -1, -1, -1): heapify(arr, n, i) for i in range(n -1,0, -1): arr[0], arr[i] = arr[i], arr[0] heapify(arr, i,0) return arr# 示例使用arr = [64,34,25,12,22,11,90] print("原始列表:", arr) print("排序后列表:", heap_sort(arr))
###7. 基数排序基数排序是一种稳定的排序算法,它通过将数字按一定的基数进行分类,然后对每个桶中的元素进行排序,以达到排序的目的。基数排序的时间复杂度为 O(nk),其中 n 是列表中的元素个数,k 是基数。
def radix_sort(arr): """ 基数排序算法 Args: arr (list): 需要排序的列表 Returns: list: 排序后的列表 """ RADIX =10 max_length = False tmp, placement = -1,0 while not max_length: max_length = True # 统计每个桶中的元素个数 buckets = [list() for _ in range(RADIX)] for i in arr: tmp = i // (RADIX ** placement) buckets[tmp % RADIX].append(i) if max_length and tmp >0: max_length = False a =0 # 将元素放回原列表中 for b in range(RADIX): buck = buckets[b] for i in buck: arr[a] = i a +=1 placement +=1 return arr# 示例使用arr = [64,34,25,12,22,11,90] print("原始列表:", arr) print("排序后列表:", radix_sort(arr))