# 冒泡排序 O(n^2)
#本地排序
def bobble_sort(arr):
n = len(arr)
for i in range(n-1): # 遍历n-1次
for j in range(i+1,n): # 每次遍历中,与首位比较n-i次
if arr[i]>arr[j]: # 比较后,符合条件就立刻进行交换
arr[i],arr[j]=arr[j],arr[i]
# 选择排序 O(n^2)
#本地排序
def select_sort(arr):
n = len(arr)
for i in range(n-1): # 遍历n-1次
min_index = i # 每次遍历开始初始化min_index=i
for j in range(i+1,n): # 每次遍历中,依次与arr[min_index]比较
if arr[min_index]>arr[j]: # 比较后,符合条件就更新min_index值
min_index = j
arr[i],arr[min_index]=arr[min_index],arr[i]# 每次遍历后进行交换
# 插入排序 O(n^2)
#本地排序
def insert_sort(arr):
n = len(arr)
for i in range(n-1): # 遍历n-1次(前i个元素已排好序)
for j in range(i+1,0,-1): # 每次遍历中,将第i+1个元素插入前面的数列
if arr[j]<arr[j-1]: # 从后向前寻找合适的插入位置
arr[j],arr[j-1]=arr[j-1],arr[j]
else: # 插入后退出for
break
# 快速排序 O(nlogn)
#本地排序
def quick_helper(a,left,right):
if left >= right: # 递归终止
return
i = left
j = right
key = a[left] # 取第一个元素为参考
while i < j: # 结束时,i=j,a[i]=key,左侧均≤key,右侧均≥key
while i < j and a[j] > key: # 从右向左找到比key小的数
j -= 1
if i < j: # 把找到的数放到左侧空位
a[i] = a[j]
i += 1
while i < j and a[i] < key: # 从左向右找到比key大的数
i += 1
if i < j: # 把找到的数放到右侧空位
a[j] = a[i]
j -= 1
a[i] = key # 把key放到中间位置
quick_helper(a, left, i - 1) # 排序左侧
quick_helper(a, i + 1, right) # 排序右侧
def quick_sort(arr):
left = 0
right = len(arr)-1
return quick_helper(arr,left,right)
# 归并排序 O(nlogn)
#非本地排序
def merge_sort_helper(arr,left,right):
if left<right:
mid = left+(right-left)//2
merge_sort_helper(arr,left,mid)
merge_sort_helper(arr, mid+1, right)
merge(arr,left,mid,right)
def merge(arr,left,mid,right):
left_i=left
right_i=mid+1
temp_arr = []
while left_i<=mid and right_i<=right:
left_value = arr[left_i]
right_value = arr[right_i]
if left_value<right_value:
temp_arr.append(left_value)
left_i+=1
else:
temp_arr.append(right_value)
right_i+=1
while left_i<=mid:
temp_arr.append(arr[left_i])
left_i += 1
while right_i<=right:
temp_arr.append(arr[right_i])
right_i += 1
index_i = left
for v in temp_arr:
arr[index_i]=v
index_i+=1
def merge_sort(arr):
merge_sort_helper(arr,0,len(arr)-1)
经典排序算法分析对比(python实现)
最新推荐文章于 2024-04-28 13:55:08 发布