1.冒泡排序:
冒泡排序是相对比较简单的排序算法,原理是依次比较数组中的元素,大的下沉,小的上浮,伪代码为
for i in range(len(nums)):
for j in range(len(nums)-i-1):
if nums[j] > nums[j+1]:
nums[j],nums[j+1] = nums[j+1],nums[j]
原理比较简单,但要注意的是数组的索引,上述方法的时间复杂度是O(n^2),对此方法进行优化,方法主要是加入一个是否进行交换的判断,如没有进行交换可认为排序已完成
for i in range(len(nums)):
is_train = 0
for j in range(len(nums)-i-1):
if nums[j] > nums[j+1]:
nums[j],nums[j+1] = nums[j+1],nums[j]
is_train = 1
if is_train ==0:
break
同时也可以尝试一下冒泡排序的进阶版:鸡尾酒排序,鸡尾酒排序的实质和冒泡排序的原理是一致的,只不过鸡尾酒排序是双向进行的;
2.选择排序:
选取序列中的最小值,将该值放到首位,再从剩下的序列中找到最下值,放到第二位,依次进行,时间复杂度为O(n^2)
伪代码为:
for i in range(len(nums)-1):
min_index = i
for j in range(i+1,len(nums)):
if nums[j] < nums[min_index]:
min_index = j
nums[i],nums[min_index] = nums[min_index],nums[i]
代码也很简单,同样需要注意的是索引部分。
3.快排:
快排可以使用单边循环法和双边循环法来实现,先使用双边循环法进行操作,算法的思想是选择字符串第一位作为基准元素,从字符串两边依次进行比较,把大于基准元素的放右边,小于基准元素的放左边;
伪代码为:
def quick_sort(nums,start,end):
if start >= end:
return
pivot = nums[start]
left = start
right = end
while left < right:
while left<right and nums[right] >=pivot:
right -=1
while left < right and nums[left] < pivot:
left +=1
if left < pivot:
nums[left],nums[right] = nums[right],nums[left]
quick_sort(nums,start,right-1)
quick_sort(nums,left+1,end)
return nums
此处需要注意的是如何呈现递归的方法,以及在递归中开始节点,结束节点的选择,代码小白调试很多次才把结果搞对。
单边循环法:
和双边循环法的逻辑基本是一致的,代码看起来会简单一些,
代码为:
def quick_sort(nums,start,end):
if start >= end:
return
pivot = nums[start]
mark = start
for i in range(start,end+1):
if nums[i] < pivot:
mark += 1
nums[mark],nums[i] = nums[i],nums[mark]
nums[start],nums[mark] = nums[mark],nums[start]
quick_sort(nums,start,mark-1)
quick_sort(nums,mark+1,end)
return nums