当前位置:实例文章 » JAVA Web实例» [文章]七大排序算法和计数排序

七大排序算法和计数排序

发布人: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))


其他信息

其他资源

Top