【数据结构与算法】归并排序,计数排序,快速排序,堆排序
发布人:shili8
发布时间:2025-02-14 04:02
阅读次数:0
**数据结构与算法**
在计算机科学中,数据结构和算法是两个基本概念,它们共同构成了计算机程序的核心。数据结构是指组织和存储数据的方式,而算法则是指解决问题或完成任务的一系列步骤。在本文中,我们将讨论四种常见的排序算法:归并排序、计数排序、快速排序和堆排序。
###1. 归并排序归并排序是一种分治法,通过递归地将数组分成两个子数组,然后对每个子数组进行排序,最终合并两个有序子数组得到最终的有序数组。归并排序的时间复杂度为 O(n log n),其中 n 是数组长度。
####代码示例
def merge_sort(arr): # 如果数组长度小于或等于1,则返回原数组(因为已经是有序的) if len(arr) <=1: return arr # 将数组分成两个子数组 mid = len(arr) //2 left = arr[:mid] right = arr[mid:] # 递归地对每个子数组进行排序 left = merge_sort(left) right = merge_sort(right) # 合并两个有序子数组得到最终的有序数组 return merge(left, right) def merge(left, right): result = [] while len(left) >0 and len(right) >0: 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))
###2. 计数排序计数排序是一种稳定的排序算法,通过对每个元素进行计数来实现。它适用于有序列中元素的范围较小的情况。
####代码示例
def count_sort(arr): # 找到最大值和最小值 min_val = min(arr) max_val = max(arr) # 计算范围 range_val = max_val - min_val +1 # 创建计数数组 count_arr = [0] * range_val # 对每个元素进行计数 for num in arr: count_arr[num - min_val] +=1 # 构造有序数组 sorted_arr = [] for i in range(range_val): sorted_arr.extend([i + min_val] * count_arr[i]) return sorted_arr# 测试arr = [4,2,2,8,3,3,1] print("原始数组:", arr) print("排序后数组:", count_sort(arr))
###3. 快速排序快速排序是一种分治法,通过选择一个基准值,然后将其他元素分成两部分(小于基准值和大于基准值),最后递归地对每个部分进行排序。快速排序的时间复杂度为 O(n log n),其中 n 是数组长度。
####代码示例
def quick_sort(arr): # 如果数组长度小于或等于1,则返回原数组(因为已经是有序的) 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))
###4. 堆排序堆排序是一种分治法,通过构造一个最大堆,然后将根节点作为最大值,最后将剩余元素重新构造成最大堆。堆排序的时间复杂度为 O(n log n),其中 n 是数组长度。
####代码示例
def heapify(arr, n, i): largest = i left =2 * i +1 right =2 * i +2 if left < n and arr[i] < arr[left]: largest = left if right < n and arr[largest] < arr[right]: largest = right if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) def heap_sort(arr): 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))
以上是四种常见的排序算法的代码示例和解释。每种算法都有其特点和适用场景,选择合适的算法可以提高程序的效率和性能。