冒泡排序
通过交换使相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复N次即可以使数组有序。
def butttle(arr):
for i in range(len(arr)-1):
exchange = False
for j in range(len(arr)-i-1):
if arr[j]>arr[j+1]:
arr[j],arr[j+1] = arr[j+1],arr[j]
exchange = True
if not exchange:
return
选择排序
数组分成有序区和无序区,初始时整个数组都是无序区,然后每次从无序区选一个最小的元素直接放到有序区的最后,直到整个数组变有序区。
def select_sort(arr):
for i in range(len(arr)-1):
min_num = i
for j in range(i+1,len(arr)):
if arr[min_num]>arr[j]:
min_num = j
if min_num != i:
arr[min_num],arr[i] = arr[i],arr[min_num]
插入排序
每次将一个待排序的数据,跟前面已经有序的序列的数字一一比较找到自己合适的位置,插入到序列中,直到全部数据插入完成。
def insert_sort(arr):
for i in range(1,len(arr)):
x = arr[i]
for j in range(i,-1,-1):
if x < arr[j-1]:
arr[j] = arr[j-1]
else:
break
arr[j] = x
快速排序
def quik_sort(arr):
if len(arr)<=1:
return arr
middle = arr[len(arr) // 2]
left = [i for i in arr if i < middle]
right = [i for i in arr if i > middle]
middle = [i for i in arr if i == middle]
return quik_sort(left) + middle + quik_sort(right)
比前一个更快
def qiuksort(array,left,right):
# 这里注意right是列表的长度减一
if left >= right:
return
low = left
high = right
key = array[low]
while left < right:
while left < right and array[right] > key:
right -= 1
array[left] = array[right]
while left < right and array[left] <= key:
left += 1
array[right] = array[left]
array[right] = key
qiuksort(array, low, left - 1)
qiuksort(array, left + 1, high)