排序算法:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法
了解排序算法原理(快速排序、归并排序、插入排序、冒泡排序、选择排序)及排序算法的变种
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
def quick_sort(nums: list, l: int, r: int) -> list: #l: 0 起始位置; r : len(nums)-1 末尾位置
"""快速排序"""
if l + 1 >= r: return #递归结束标志
first = l #序列左边在开始位置的由左向右移动的游标
last = r-1 #序列右边末尾位置的由右向左移动的游标
key = nums[first] #设定起始的基准元素
while first < last:
while first < last and nums[last] >=key: # 如果first 与last 未重合,last (右边)指向的元素大于等于基准元素,则last 向左移动
last -= 1
nums[first] = nums[last] #走到此位置时last指向一个比基准元素小的元素,将last指向的元素放到first的位置上,此时last指向的位置空着,接下来移动first找到符合条件的元素放在此处
while first < last and nums[first] <= key: #如果first与last未重合,first指向的元素比基准元素小,则first向右移动
first += 1
nums[last] = nums[first] # 此时first指向一个比基准元素大的元素,将first指向的元素放到last空着的位置上,此时first指向的位置空着,之后进行下一次循环,将last找到符合条件的元素填到此处
# 退出循环后,first与last重合,此时所指位置为基准元素的正确位置,左边的元素都比基准元素小,右边的元素都比基准元素大
nums[first] = key # 将基准元素放到该位置
#对基准元素左边的子序列进行快速排序
quick_sort(nums,l,first) # l:0 first-1 原基准元素靠左边一位
# 对基准元素右边的子序列进行快速排序
quick_sort(nums,first+1,r) #first+1 : 原基准元素靠右一位 r: 最后
首先归并排序使用了二分法。给定一个数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将她们按照两个有序数组的样子合并起来。
def merge_sort(nums: list, l: int, r: int, temp:list) -> list:
"""归并排序"""
if l + 1 >= r: return #递归结束标志
# 切分
mid = l + (r - 1)//2
merge_sort(nums,l,mid,temp)
merge_sort(nums,mid,r,temp)
#合并
p,q,i = l,mid,l
while p < m or q < r:
if q >= r or (p < m and nums[p] <= nums[q]):
temp[i] = nums[p]
i+=1
p+=1
else:
temp[i] = nums[q]
i+=1
q+=1
for i in range(l,r):
nums[i] = temp[i]
插入排序的思想和我们打扑克摸牌的时候一样,从牌堆里一张一张摸起来的牌都是乱序的,我们会把摸起来的牌插入到左手中合适的位置,让左手中的牌时刻保持一个有序的状态。
def insert_sort(self, nums: list) -> list:
"""插入排序"""
for i in range(1, len(nums)):
key = nums[i]
for j in range(1,i+1)[::-1]:
if j>0 and key < nums[j-1]:
nums[j] = nums[j-1]
nums[j-1] = key
return param
冒泡排序就是遍历数据,每次只与下一个数字比较,如果这两个数顺序不对,则与交换过来。
def bublle_sort(nums: list) -> list:
"""冒泡排序"""
n = len(nums)
for j in range(n-1):
count = 0
for i in range(0, n-1-j):
#从头走到尾
if nums[i]>nums[i+1]:
nums[i],nums[i+1] = nums[i+1],nums[i]
count +=1
if 0 == count:
break
return nums
选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置。
def selection_sort(nums: list) -> list:
"""选择排序"""
# 第一层for表示循环选择的遍数
for i in range(len(nums) - 1):
# 将起始元素设为最小元素
min_index = i
# 第二层for表示最小元素和后面的元素逐个比较
for j in range(i + 1, len(nums)):
if nums[j] < arr[min_index]:
# 如果当前元素比最小元素小,则把当前元素角标记为最小元素角标
min_index = j
# 查找一遍后将最小元素与起始元素互换
nums[min_index], nums[i] = nums[i], nums[min_index]
return arr