首先我们从最经典的冒泡排序开始讨论:
python
def bubble_sort(arr):
n = len(arr)
for i in range(n-1):
# 每一轮遍历都可能把最大的元素"浮到顶部"
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
# 交换相邻的两个值
arr[j], arr[j + 1] = arr[j + 1], arr[j]
# 示例:
arr = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(arr)
print("Sorted array:", arr)
尽管简单易懂,但冒泡排序的时间复杂度为O(n^2),对于大规模数据效率较低。
接下来考虑插入排序:
python
def insertion_sort(arr):
for index in range(1, len(arr)):
current_value = arr[index]
position = index
while(position>0 and arr[position - 1]>current_value) :
arr[position]=arr[position-1]
position-=1
arr[position]=current_value
#示例:
insertion_arr = [12, 11, 13, 5, 7 ,8 ]
insertion_sort(insertion_arr)
print ("Insertion Sorted Array : ",insertion_arr )
插入排序对小规模或者近乎有序的数据表现良好,但在最坏情况下的时间复杂性同样也是O(n^2)。
然后是快速排序,这是一种高效的分治策略排序法:
python
def quicksort(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 quicksort(left) + middle + quicksort(right)
# 示例:
quicksort_list = [3,6,8,10,1,2,1]
sorted_array = quicksort(quicksort_list)
print(sorted_array)
快速排序平均情况下具有线性的分割性质(即每次都能将近似均等划分),因此它的平均时间复杂度可以达到 O(n log n)。
再来看看选择排序:
python
def selection_sort(arr):
for idx in range(len(arr)-1):
min_idx =idx
for jdx in range(idx+1,len(arr)):
if arr[min_idx]>arr[jdx]:
min_idx=jdx
arr[idx],arr[min_idx] = arr[min_idx],arr[idx]
# 示例:
selection_arr=[64, 34, 25, 12, 22, 11, 90]
selection_sort(selection_arr)
print(f'Selection sorted array is {selection_arr}')
虽然每轮循环都可以找到剩余未排好序的部分中的最小或最大项并放到正确位置上,但是整体来看,选择排序也属于O(n²)复杂度的算法。
最后提及归并排序,它也是一种基于分治思想的稳定排序算法:
python
def merge_sort(lst):
if len(lst)<=1: return lst
mid = len(lst)//2
lefthalf = merge_sort(lst[:mid])
righthalf = merge_sort(lst[mid:])
return merge(lefthalf,righthalf)
def merge(lh,rh):
mergedlist=[]
lhindex=0;
rhindex=0;
while (lhindex<len(lh))and(rhindex<len(rh)):
if lh[lhindex]<rh[rhindex]:
mergedlist.append(lh[lhindex])
lhindex+=1
else:
mergedlist.append(rh[rhindex])
rhindex+=1
mergedlist.extend(lh[lhindex:])
mergedlist.extend(rh[rhindex:])
return mergedlist
unsorted_lst =[9,5,2,7,1,6,3]
result =merge_sort(unsorted_lst)
print(result)
与快速排序不同的是,无论输入序列的状态怎样,归并排序始终保证了稳定的O(n log n) 时间复杂度。
以上五种排序算法只是众多排序技术中的一小部分,它们各自有适用场景及优缺点。理解这些基本概念有助于我们在实际开发过程中更好地运用合适的排序方式处理各种类型的问题。同时通过编写对应的Python代码实践过程也能加深对我们编程能力以及问题解决思路的理解。