冒泡排序
冒泡排序(Bubble Sort) 最为简单的一种排序,通过重复走完数组的所有元素,通过打擂台的方式两个两个比较,直到没有数可以交换的时候结束这个数,再到下个数,直到整个数组排好顺序。因一个个浮出所以叫冒泡排序。双重循环时间 O(n^2)
算法步骤
- 比较相邻两个数据如果。第一个比第二个大,就交换两个数
- 对每一个相邻的数做同样1的工作,这样从开始一队到结尾一队在最后的数就是最大的数。
- 针对所有元素上面的操作,除了最后一个。
- 重复1~3步骤,知道顺序完成。
可视化
代码
def bubbleSort(nums):
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[j]<nums[i]:
tmp = nums[i]
nums[i] = nums[j]
nums[j] = tmp
return nums
print(bubbleSort([2,7,3,1,4,6,3,2,5,8,3]))
选择排序
选择排序(Select Sort) 是直观的排序,通过确定一个 Key 最大或最小值,再从带排序的的数中找出最大或最小的交换到对应位置。再选择次之。双重循环时间复杂度为 O(n^2)
算法步骤
- 在一个长度为 N 的无序数组中,第一次遍历 n-1 个数找到最小的和第一个数交换。
- 第二次从下一个数开始遍历 n-2 个数,找到最小的数和第二个数交换。
- 重复以上操作直到第 n-1 次遍历最小的数和第 n-1 个数交换,排序完成。
可视化
代码
def selectSort(nums):
for i in range(len(nums)):
minIdx = i
for j in range(i+1,len(nums)):
if nums[j]<nums[minIdx]:
minIdx = j
if minIdx != i:
tmp = nums[minIdx]
nums[minIdx] = nums[i]
nums[i] = tmp
return nums
print(selectSort([2,7,3,1,4,6,3,2,5,8,3]))
快速排序
快速排序(QuickSort)是排除稳定性因素后最常用的排序。通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
算法步骤
- 从数列中挑出一个元素作为基准。
- 重新排列数列,把所有的比基准小的放在基准前面,反之放在后面(一样大可任意一边)完成后基准处在分区的中间位置。
- 通过递归调用把小于基准元素和大雨基准元素的子序列进行排序。
可视化
代码
def partition(nums, left, right):
pivot = nums[left]#初始化一个待比较数据
i,j = left, right
while(i < j):
while(i<j and nums[j]>=pivot): #从后往前查找,直到找到一个比pivot更小的数
j-=1
nums[i] = nums[j] #将更小的数放入左边
while(i<j and nums[i]<=pivot): #从前往后找,直到找到一个比pivot更大的数
i+=1
nums[j] = nums[i] #将更大的数放入右边
#循环结束,i与j相等
nums[i] = pivot #待比较数据放入最终位置
return i #返回待比较数据最终位置
#快速排序
def quicksort(nums, left, right):
if left < right:
index = partition(nums, left, right)
quicksort(nums, left, index-1)
quicksort(nums, index+1, right)
arr = [10,3,2,2,0]
quicksort(arr, 0, len(arr)-1)
print(arr)
猜你喜欢:👇🏻
⭐【Leetcode】大神总结的所有TopK问题模板(基于快速排序)
⭐【Leetcode】岛屿问题(数量,周长,面积)
⭐【Leetcode】二分法左侧边界右侧边界模板