数据结构与算法之数据结构 数组排序 基于比较 / 非比较排序 适配

数据结构与算法阿木 发布于 2025-07-11 6 次阅读


摘要:

本文将围绕数组排序这一主题,深入探讨基于比较和非比较的排序算法。首先介绍排序算法的基本概念和重要性,然后详细解析几种常见的基于比较的排序算法,如冒泡排序、选择排序、插入排序等,接着介绍几种非比较排序算法,如计数排序、基数排序等,最后总结排序算法的选择和应用场景。

一、

排序算法是计算机科学中一个基础且重要的领域,它广泛应用于数据处理、数据库管理、算法竞赛等多个领域。数组排序作为排序算法的一个典型应用,其效率和稳定性直接影响着程序的性能。本文将围绕数组排序这一主题,从基于比较和非比较的排序算法两个方面进行探讨。

二、基于比较的排序算法

1. 冒泡排序

冒泡排序是一种简单的排序算法,它通过重复遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行,直到没有再需要交换的元素为止。

python

def bubble_sort(arr):


n = len(arr)


for i in range(n):


for j in range(0, n-i-1):


if arr[j] > arr[j+1]:


arr[j], arr[j+1] = arr[j+1], arr[j]


return arr


2. 选择排序

选择排序是一种简单直观的排序算法。它的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

python

def selection_sort(arr):


n = len(arr)


for i in range(n):


min_idx = i


for j in range(i+1, n):


if arr[min_idx] > arr[j]:


min_idx = j


arr[i], arr[min_idx] = arr[min_idx], arr[i]


return arr


3. 插入排序

插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序)。

python

def insertion_sort(arr):


for i in range(1, len(arr)):


key = arr[i]


j = i-1


while j >=0 and key < arr[j]:


arr[j+1] = arr[j]


j -= 1


arr[j+1] = key


return arr


三、非比较排序算法

1. 计数排序

计数排序是一种非比较排序算法,其基本思想是统计数组中每个值出现的次数,然后根据统计结果来排序。计数排序适用于整数排序,特别是当数组中最大值和最小值之间的差距不是很大时。

python

def counting_sort(arr):


max_val = max(arr)


min_val = min(arr)


range_val = max_val - min_val + 1


count = [0] range_val


for num in arr:


count[num - min_val] += 1


sorted_arr = []


for i in range(range_val):


sorted_arr.extend([i + min_val] count[i])


return sorted_arr


2. 基数排序

基数排序是一种非比较排序算法,其基本思想是按照低位先排序,然后收集;再按高位排序,然后再收集;依次类推,直到最高位。基数排序的时间复杂度为O(nk),其中n是数组的长度,k是数字的最大位数。

python

def counting_sort_for_radix(arr, position):


output = [0] len(arr)


count = [0] 10


for num in arr:


index = (num // position) % 10


count[index] += 1


for i in range(1, 10):


count[i] += count[i - 1]


i = len(arr) - 1


while i >= 0:


index = (arr[i] // position) % 10


output[count[index] - 1] = arr[i]


count[index] -= 1


i -= 1


for i in range(len(arr)):


arr[i] = output[i]


if position > 1:


counting_sort_for_radix(arr, position // 10)

def radix_sort(arr):


max_val = max(arr)


position = 1


while max_val // position > 0:


counting_sort_for_radix(arr, position)


position = 10


return arr


四、总结

本文从基于比较和非比较的排序算法两个方面,详细介绍了冒泡排序、选择排序、插入排序、计数排序和基数排序等常见排序算法。在实际应用中,应根据具体场景和数据特点选择合适的排序算法,以达到最佳的性能表现。