Leetcode部分排序相关练习
一、排序
在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生改变,则称这种排序方法是不稳定的。即所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,则说这种排序算法是稳定的,反之,就是不稳定的。
1. 稳定的排序算法
稳定的排序 | 时间复杂度 | 空间复杂度 |
---|---|---|
冒泡排序(bubble sort) | 最差、平均都是O(n^2),最好是O(n) | 1 |
插入排序(insertion sort) | 最差、平均都是O(n^2),最好是O(n) | 1 |
归并排序(merge sort) | 最差、平均、最好都是O(n log n) | O(n) |
桶排序(bucket sort) | O(n) | O(k) |
基数排序(Radix sort) | O(dn)(d是常数) | O(n) |
二叉树排序(Binary tree sort) | O(n log n) | O(n) |
1.1 冒泡排序的实现
使用双重for循环,内层变量为i, 外层为j,在内层循环中不断的比较相邻的两个值(i, i+1)的大小,如果i+1的值大于i的值,交换两者位置,每循环一次,外层的j增加1,等到j等于n-1的时候,结束循环
def bubble_sort(arr):
n = len(arr)
for j in range(0, n - 1):
for i in range(0, n - 1 - j): # i每循环一次都能把最大的值以此从右边排起
if arr[i] > arr[i + 1]:
arr[i], arr[i + 1] = arr[i + 1], arr[i]
arr = [7, 4, 3, 67, 34, 1, 8]
bubble_sort(arr)
print(arr) # [1, 3, 4, 7, 8, 34, 67]
1.2 插入排序的实现
排序以从小到大排序为例,元素0为第一个元素,插入排序是从元素1开始,尽可能插到前面。插入时分插入位置和试探位置,元素i的初始插入位置为i,试探位置为i-1,在插入元素i时,依次与i-1,i-2······元素比较,如果被试探位置的元素比插入元素大,那么被试探元素后移一位,元素i插入位置前移1位,直到被试探元素小于插入元素或者插入元素位于第一位。
def insertSort(arr):
length = len(arr)
for i in range(1,length):
x = arr[i] # 考虑插入的数
for j in range(i,-1,-1):
# j为当前位置,试探j-1位置
if x < arr[j-1]:
arr[j] = arr[j-1]
else:
# 位置确定为j