一直捋不清几个排序,特意花点时间理解一下,有码有字有动图,明天补完
1、插入排序:
不断将待排序中元素一个一个插入一个有序序列中(一般初始为待排序序列中的第一个元素,且待排序列表和有序列表其实在一个列表),最终得到有序序列。
如图:
实现代码:
def insert_sort(lst):
# 认为lst中元素第一个已排序
for i in range(1,len(lst)):
# x为待排序元素
x=lst[i]
# 有序列表元素索引
j = i
# 当前待插入元素与有序列表元素对比大小,若大于其的元素位置整体后移一位,为其腾出位置
while j>0 and lst[j-1]>x:
# 实现后移
lst[j]=lst[j-1]
# 目标索引位置
j-=1
# 将当前待插入元素插入此时j位置
lst[j]=x
lst=[1,2,5,3,45,23,2]
insert_sort(lst)
print (lst)
#output:[1, 11, 19, 27, 30, 31, 45]
2、选择排序:
顺序遍历待排序列表,每一趟找到列表剩余元素最小的值完成排序。
如图:
实现代码:
def select_sort(lst):
# 遍历列表
for i in range(len(lst)):
x=i
# 遍历剩余元素
for j in range(x+1,len(lst)):
# 假如剩余元素列表中有元素小于
if lst[j] < lst[x]:
# 将新最小值索引赋予x变量
x=j
# 交换元素位置
lst[i], lst[x] = lst[x], lst[i]
lst=[1,2,5,3,45,23,2]
select_sort(lst)
print (lst)
3、冒泡排序:
比较两个元素大小,如果这两个元素的大小出现逆序,则交换这两个元素,这样将较小的元素向前移动,较大的元素向后移动,完成排序。
如图:
实现代码:
def bubble_sort(lst):
#遍历列表
for i in range(len(lst)):
# 此方法将最小或者最大值排到最后,因此内循环遍历是从1到len(lst)-i
for j in range(1,len(lst)-i):
# 遇到逆序即交换元素位置
if lst[j-1]>lst[j]:
lst[j-1],lst[j]=lst[j],lst[j-1]
lst = [19,2,31,45,6,11,121,27]
bubble_sort(lst)
print(lst)
4、快速排序
首先选取一个基准,将列表元素分为大于基准和小于基准两部分,然后递归的对两部分元素进行快排,直到列表全部有序。
如图:
实现代码:
def quick_sort(lst):
# 递归排序
def qsort(lst,begin,end):
# 递归过程中始终保持begin大于end
if begin >= end:
return True
# 基准
a=lst[begin]
# 基准位置索引
i=begin
for j in range(begin+1,end+1):
# 小于基准值时候向右遍历且当前i位置的值(较大值)与当前较小值交换位置。
if lst[j]1
lst[i],lst[j]=lst[j],lst[i]
print(lst)
# 较小值移动完毕交换当前基准值与最后一个较小值位置
lst[begin],lst[i]=lst[i],lst[begin]
# 递归大数区域小数区域
qsort(lst,begin,i-1)
qsort(lst,i+1,end)
qsort(lst,0,len(lst)-1)
lst = [19,2,31,45,6,11,121,27]
quick_sort(lst)
print("\n")
print(lst)
output:
[19, 2, 31, 45, 6, 11, 121, 27]
[19, 2, 6, 45, 31, 11, 121, 27]
[19, 2, 6, 11, 31, 45, 121, 27]
[11, 2, 6, 19, 31, 45, 121, 27]
[11, 2, 6, 19, 31, 45, 121, 27]
[6, 2, 11, 19, 31, 45, 121, 27]
[2, 6, 11, 19, 31, 27, 121, 45]
[2, 6, 11, 19, 27, 31, 121, 45]
[2, 6, 11, 19, 27, 31, 45, 121]
再挂个简单易懂的
def quicksort(lst):
if len(lst) < 2:
return lst
else:
result = lst[0]
less = [x for x in lst[1:] if x <= result]
more = [x for x in lst[1:] if x > result]
return quicksort(less)+[result]+quicksort(more)
lst= [6,23,6,7,10,2,54,5]
print(quicksort(lst))
归并排序
将原列表不断进行这样一个过程,对半分割,对子数组分割,直到分无可分,开始归并,单元素数组归并并排序成一个双元素数组,直到将所有元素排序合并。
def merge(left, right):
i, j = 0, 0
result = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i+=1
else:
result.append(right[j])
j+=1
result+=left[i:]
result+=right[j:]
return result
def merge_sort(lst):
if len(lst)<=1:
return lst
num=len(lst)/2
left= merge_sort(lst[:num])
right=merge_sort(lst[num:])
return merge(left,right)
lst=[1,6,2,3,2,4,5,3,4]
print merge_sort(lst)
参考:
《数据结构与算法》
动图来源