1 冒泡排序
按照一个列表中从左到右,依次的将list[i] 和list[i+1]进行比较,将大的数放到右边,直至最大数被排到最大的位置。
将上述循环执行直到所有数都已经正确的排序
def bubble_sort(alist):
n = len(alist)
for j in range(n-1):#这里的j表示已经有j个数已经排好了
count = 0
for i in range(n-1-j):#每排好一个数,需要比较的数就少一个
if alist[i] > alist[i+1]:
alist[i],alist[i+1] = alist[i+1],alist[i]
count += 1
if count == 0:#表示走过一遍之后没有交换,即是有序的
return
2 选择排序
将需要排序的列表分成两部分,左边已经排序的,右边未排序,依次选择右边的最小值放到左边
def select_sort(alist):
n = len(alist)
for j in range(n-1):
min_index = j
for i in range(j+1,n):
if alist[min_index] > alist[i]:
min_index = i
alist[j],alist[min_index] = alist[min_index],min[j]
3 插入排序
假设第一个数是有序的,然后将原始liebiao分成两部分,左边为有序,右边是无序得,依次在右边序列取一个数字,放到左边的合适位置。
def insrt_sort(alist):
n = len(alist)
for j in range(1,n):
i = j # i内层循环的起始值
while i > 0: # 也可以这样写 for i in range(j,0,-1):
#从右边取出一个值,即i位置的元素,然后将其插入到左侧序列,在左侧序列进行比较,直至合适位置
if alist[i] <alist[i-1]:
alist[i],alist[i-1] = alist[i-1],alist[i]
i -= 1
else:
braak
3 希尔排序
希尔排序的基本思想是:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身还是使用数组进行排序。
希尔排序中的按照一定步长找到的数组成新的序列,这个序列是逻辑上的序列,并不真实存在,这些序列里的索引还是原始序列中的索引。
def shell_sort(alist):
n = len(alist)
gap = n // 2
while gap > 0:
for j in range(gap,n):
i = j
while i > 0
if alist[i] < alist[i-gap]: #依次对使用gap重构的数组遍历
alist[i],alist[i-gap] = alist[i-gap],alist[i]
i -= gap # 现在这个数组的间隔是gap
else:
break
gap //= 2
4 快速排序
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 步骤:
- 从序列中挑出一个数作为基准(通常是第一个数)
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
def quick_sort(alist,first,last):
if first >= last:
return
mid_value = alist[first]
low = first
high = last
while low < high:
while low < high and alist[high] >= mid_value:
high -= 1
alist[low] = alist[high]
while low < high and alist[low] < mid_value:
low += 1
alist[high] = alist[low]
alist[low] = mid_value
quick_sort(alist,first,low_1)
quick_sort(alist,low+1,len(alist)-1)
常见排序的时间复杂度