快速排序
快排又被称为分治法。其主要思想分为三步:
1.从待排序数列中取出一个数作为基准数
2.一次排序,将大于基准数的数放在基准数右边,小于基准数的放在基准数左边
3.分别对一次排序后形成的左右区间重复步骤二,直到各区间只剩一个数
快速排序的时间复杂度
最好的时间复杂度为:
最坏的时间复杂度为:
python实现如下:
# 快排1
def quick_sort(lst,left,right):
if left < right: # 至少两个或两个以上元素 则递归
mid = partition(lst,left,right)
quick_sort(lst,left,mid-1)
quick_sort(lst,mid+1,right)
# 快排2
def partition(lst,left,right):
tmp = lst[left]
while left < right:
while left < right and lst[right] >= tmp: # 从右边找比最左边tmp小的数
right -= 1 # 没找到比它小的,向左走一位
lst[left] = lst[right] # 把右边找到的比left小的数写到left空位上
print(lst,'右边')
while left < right and lst[left] <= tmp:
left += 1
lst[right] = lst[left] # 找到的话把左边找到的比left大的值写到右边空位上
print(lst, '左边')
lst[left] = tmp # 把 tmp 归位 写到共同的位置(left=right)上
return left
收录了一种更为简单的快排算法
def quicksort(array):
if len(array) < 2:
return array
else:
pivot = array[0]
less = [i for i in array[1:] if i <= pivot]
greater = [i for i in array[1:] if i > pivot]
return quicksort(less) + [pivot] + quicksort(greater)
冒泡排序
冒泡排序的名字很有趣,就如排序方式特点确实很符合它的名字,其主要思想分为四部:
1.从待排序列的开头开始遍历,依次比较两个相邻的元素,如果第一个元素大于第二个元素,就交换二者位置,反之无操作。
2.对数列中的每个元素除了最后一个依次重复以上步骤
3.一次遍历完成,将这时的数列取出最后一个元素作为新的数列重复步骤1、步骤2
4.遍历直到没有需要交换位置的数字为止
冒泡排序的时间复杂度
python实现如下:
# 冒泡
def bubble_sort(lst):
for i in range(len(lst)-1): # 第i趟
exchange = False
for j in range(len(lst)-i-1):
if lst[j] > lst[j+1]: # 大于改为小于即为降序排列
lst[j],lst[j+1] = lst[j+1],lst[j]
exchange = True
print(lst)
if not exchange:
return
同时也收录了较为简单的冒泡排序
def bubble_sort(arr):
# 我个人理解这个是不用进行比较的个数,第一次是最后一个,第二次是倒数两个...
for i in range(1, len(arr)):
# 从第一个比第二个 比到 第n-1个比第n个 所以是range(0, len(arr)-i)
for j in range(0, len(arr)-i):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr