基础算法之排序(一)

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)
	

常见排序的时间复杂度
在这里插入图片描述

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页