目录
先贴出八大排序算法的分类图及复杂度分析图。
此次博客中的冒泡排序、快速排序都是属于交换排序。博客代码是博主想复习下排序算法然后手打的,已经过调试。若还有错误请指出!
一、冒泡排序
算法思想:
这个算法的名字由来是因为越大元素会经由交换慢慢“浮”到数列的顶端,故名冒泡排序。
它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
第i趟就是把第i大的数“浮”到后i个位置,如第一趟就是把最大的数“浮”到最后的一个位置
平均 最坏 最好 空间 稳定性 复杂性
O(n²) O(n²) O(n) O(1) 稳定 简单
算法稳定性
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,
这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,
而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
Python代码
def bubble_sort(input_list):
if len(input_list) <= 1:
return input_list
n = len(input_list)
for i in range(n-1): # 有n个数,则可能有n-1躺排序。如第一趟就是把最大的数“浮”到最后的一个位置
exchange = False # 设置交换信号量,置为False
for j in range(n-1-i):
if input_list[j] > input_list[j+1]: # 若前一个数大于后一个数,则交换两个数,即大的数“浮”上去
input_list[j],input_list[j+1] = input_list[j+1],input_list[j]
exchange = True
if not exchange: # 若一趟下来,没有交换过,则说明数组已经排序完毕
break
return input_list
二、快速排序
算法思想:
通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
数据越随机分布时,快速排序性能越好;数据越接近有序,快速排序性能越差。
快速排序在每次分割的过程中,需要 1 个空间存储基准值。而快速排序的大概需要 NlogN次的分割处理,所以占用空间也是 NlogN 个。
平均 最坏 最好 空间 稳定性 复杂性
O(nlogn) O(n²) O(nlogn) O(nlogn) 不稳定 较复杂
算法稳定性
在快速排序中,相等元素可能会因为分区而交换顺序,所以它是不稳定的算法。
Python代码
def division(input_list,left,right):
'''
函数说明:根据left和right进行一次扫描,重新找到基准数的位置
Parameters:
input_list - 待排序列表
left - 左指针位置
right - 右指针位置
Returns:
left - 新的基准数位置,即分割点
'''
base = input_list[left] # 将开始值作为基准数
while left < right: # 两个指针重合才推出while循环
while left < right and input_list[right] >= base: # 第二个while循环的left<right控制两个指针不能绕过对方去寻找值,控制重合的可能
right -= 1
input_list[left] = input_list[right]
while left < right and input_list[left] <= base:
left += 1
input_list[right] = input_list[left]
input_list[left] = base
return left
def quick_sort(input_list,left,right):
if left < right:
base_index = division(input_list,left,right)
quick_sort(input_list,left,base_index-1)
quick_sort(input_list,base_index + 1,right)
return input_list
print(quick_sort([10,9,8,7,6,5,4],0,6))