飞道的博客

Python常见的排序算法

375人阅读  评论(0)

冒泡

比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
a = [45,85,3,45,96,27,85,91]

for i in range(len(a)-1):
	for j in range(0,len(a)-1-i):
		if a[j] > a[j+1]:
			a[j], a[j+1] = a[j+1], a[j]

print(a)

最优时间复杂度为:o(n)
最坏时间复杂度为:o(n²)

选择

1.设第一个元素为比较元素,依次和后面的元素比较,比较完所有元素找到最小的元素,将它和第一个元素互换
2.重复上述操作,我们找出第二小的元素和第二个位置的元素互换,以此类推找出剩余最小元素将它换到前面,即完成排序

a = [45,85,3,45,96,27,85,91]

for i in range(0, len(a)-1):
	for j in range(i+1, len(a)):
		if a[i] > a[j]:
			a[i], a[j] = a[j], a[i]

print(a)

最优时间复杂度为:o(n²)
最坏时间复杂度为:o(n²)

插入

后面的一次向前比较
a = [45,85,3,45,96,27,85,91]

for i in range(1, len(a)):
	for j in range(i, 0, -1):
		if a[j] < a[j-1]:
			a[j], a[j-1] = a[j-1], a[j]

print(a)

最优时间复杂度为:o(n)
最坏时间复杂度为:o(n²)

快速排序

对于一串序列,首先从中选取一个数,凡是小于这个数的值就被放在左边一摞,凡是大于这个数的值就被放在右边一摞。然后,继续对左右两摞进行快速排序。

def fast_sort(a, start, end):

    if start >= end:
        return

    mid = a[start]
    low = start
    high = end
    while low < high:
        while low < high and a[high] >= mid:
            high -= 1
        a[low] = a[high]
        while low < high and a[low] < mid:
            low += 1
        a[high] = a[low]
    a[low] = mid

    fast_sort(a, start, low - 1)
    fast_sort(a, low + 1, end)


a = [22, 34, 45, 66, 16, 10, 18, 28]

fast_sort(a, 0, len(a) - 1)

print(a)


最优时间复杂度为:o(logn)
最坏时间复杂度为:o(n²)

二分法查找

(有序)
最优时间复杂度为:o(1)
最坏时间复杂度为:o(logn)

递归(效率低)

def search(a,item):
	if len(a) == 0:
		return False
	elem = item
	mid = len(a) // 2
	if elem == a[mid]:
		return True
	elif elem > a[mid]:
		return search(a[mid + 1:], item)
	else:
		return search(a[:mid], item)


非递归(效率高)

a = [22, 34, 45, 66, 16, 10, 18, 28]

def search(a, item):
	low = 0
	high = len(a) - 1

	while low <= hing:
		mid = (low + high) // 2
		if item == a[mid]:
			return True
		elif item > a[mid]:
			low = mid + 1
		else:
			high = mid - 1
	return False

print(search(a, 18))

转载:https://blog.csdn.net/Bankofli/article/details/104878192
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场