冒泡排序
冒泡排序是一种交换排序算法。
例子:
有8个数组成一个无序数列:5,8,6,3,9,2,1,7,希望从小到大排序。
第一趟排序:
第一次交换:5,6,8,3,9,2,1
第二次交换:5,6,3,8,9,2,1
第三次交换:5,6,3,8,9,2,1
第四次交换:5,6,3,8,2,9,1
第五次交换:5,6,3,8,2,1,9
由上可以看出,在第一趟排序的结果中,最大的数9到了最后,经过交换。
冒泡排序的python代码实现:
双层循环实现从小到大的排序
def bubblesort(arr):
for i in range(1, len(arr)):
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
双层循环实现从大到小的排序
def bubblesort(arr):
for i in range(1, len(arr)):
for j in range(len(arr) - i - 1, -1,-1):
if arr[j] < arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1],arr[j]
return arr
从大到小排序和从小到大排序之间的区别在于遍历是从尾端开始还是从始端开始。
冒泡排序的时间复杂度O(n2),空间复杂度是O(1),冒泡排序是稳定的排序算法。
快速排序:
(1)选择基准值
(2)将数组分成两个子数组:小于基准值的元素和大于基准值的元素
(3)对这两个子数组进行快排
快速排序代码:
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,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2,1。
思路参考:
https://leetcode-cn.com/problems/next-permutation/solution/xia-yi-ge-pai-lie-suan-fa-xiang-jie-si-lu-tui-dao-/
算法推导:
基于以上分析,需要写出算法的过程(即代码的过程):
小总结:
根据算法分析写出算法过程的步骤,需要认真发现规律,到底是如何变化的,才能写出适用的算法伪代码。
分析代码的过程
代码如下:
class Solution:
def nextPermutation(self, nums):
"""
Do not return anything, modify nums in-place instead.
"""
if len(nums) < 2:
return nums
i = len(nums) - 1
#首先找出升序的i值
# print(i)
while(nums[i - 1] >= nums[i] and i >= 0):
i -= 1
# print(i)
#从后向前查找大于i-1数的元素
for j in range(len(nums) - 1, i - 1, -1):
if nums[j] > nums[i - 1]:
temp = nums[i - 1]
nums[i - 1] = nums[j]
nums[j] = temp
break
#对i-1之后的数进行降序
de = nums[i:]
de.sort()
nums[i:] = de
return nums