冒泡排序
事件复杂度是o(n的平方),会改变数组的顺序,稳定的排序,即如果两个3同时出现,不会改变两个3原有的位置
if __name__ == '__main__':
# 升序
arr = [3, 5, 1, 0, 10, 2, 4]
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]
print(arr)
# 降序
arr2 = [3, 5, 1, 0, 10, 2, 4]
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]
print(arr)
快速排序
快速排序的思想:
每一趟快排分两个步骤
- 先找基准值(默认用第一个)
- 按基准值将待排序数组分为两部分
- 然后对两个部分分别进行快排
具体的快排操作为:
以第一个值为基准,后边每一个值与第一个值进行比较,定义两个变量,一个记录每一个要遍历的值i,另一个变量index标识下一个需要交换值的位置
如果arr[i]大于第一个值,i+1即可
否则,将i位置上的值和index位置上的值进行交换,index和i都后移一个
如果一个数组是[4,5,2,6,7,1],经过以上遍历后是[4,2,1,6,7,5],index=3,此时需要把首位置的4放在该放的位置上,该放的位置是index-1的位置,即将首位和index-1的位置互换即可
代码:
def quick_sort(arr, left, right):
if left < right:
index = partition(arr, left, right)
quick_sort(arr, left, index - 1)
quick_sort(arr, index + 1, right)
return arr
def partition(arr, left, right):
# 具体的快排操作
index = left + 1
i = index
while i <= right:
if arr[i] < arr[left]:
swap(arr, i, index)
index += 1
i += 1
swap(arr, left, index - 1)
return index - 1
def swap(arr, i, j):
arr[i], arr[j] = arr[j], arr[i]
if __name__ == '__main__':
arr = [1, 5, 2, 3, 7, 4, 9, 10]
quick_sort(arr, 0, len(arr) - 1)
print(arr)