一些常用的排序算法 (包含源码)
作者:互联网
1 低效率排序
1.1 冒泡排序
排序原理:冒泡排序的原理是通过让较大的数依次往后排或往前排,或者是较小的数依次往后排或前排
代码实现:
def bubbling(li):
for i in range(len(li) - 1): # 排序躺数,比如一个有三个元素的数列需要将两个元素进行排序
for j in range(1, len(li) - i):
if li[j - 1] > li[j]:
li[j - 1], li[j] = li[j], li[j - 1]
算法效率:
时间复杂度:O(n2)
空间发杂度:O(1)
1.2 选择排序
排序原理:从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。
代码实现:
def select_sort(li):
for i in range(len(li) - 1): # 排序趟数
for j in range(i, len(li)):
if li[j] > li[i]:
li[i], li[j] = li[j], li[i]
算法效率:
时间复杂度:O(n2)
空间发杂度:O(1)
1.3 插入排序
排序原理:插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
代码实现:
def insert_sort(li):
for i in range(1, len(li)):
j = i - 1
current_num = li[i]
while j >= 0 and current_num <= li[j]:
li[j + 1] = li[j]
j -= 1
li[j + 1] = current_num
return li
算法效率:
时间复杂度:O(n2)
空间发杂度:O(1)
2 高效率排序
2.1 快速排序
排序原理:排序算法的思想非常简单,在待排序的数列中,我们首先要找一个数字作为基准数(这只是个专用名词)。为了方便,我们一般选择第 1 个数字作为基准数(其实选择第几个并没有关系)。接下来我们需要把这个待排序的数列中小于基准数的元素移动到待排序的数列的左边,把大于基准数的元素移动到待排序的数列的右边。这时,左右两个分区的元素就相对有序了;接着把两个分区的元素分别按照上面两种方法继续对每个分区找出基准数,然后移动,直到各个分区只有一个数时为止。
代码实现:
def quick_sort(li):
import random
def _partition(li, left, right):
ran = random.randint(left, right) # 随机选值,减小最坏情况发生
tmp = li[ran] # 用最左端的数回填取出的数
li[ran] = li[left]
while left < right:
while left < right and li[right] >= tmp:
right -= 1
li[left] = li[right]
while left < right and li[left] <= tmp:
left += 1
li[right] = li[left]
li[left] = tmp
return left
def _quick_sort(li, left, right):
if left < right:
middle = _partition(li, left, right)
_quick_sort(li, left, middle - 1)
_quick_sort(li, middle + 1, right)
_quick_sort(li, 0, len(li) - 1)
算法效率:
时间复杂度:O(nlog2n)
空间复杂度:O(log2n)
2.2 堆排序
排序原理:堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样根节点会是n个元素中的次小值,将其与n-1的元素互换,剩下n-2个元素继续建堆。如此反复执行,便能得到一个有序序列了。(反之,降序则建立小顶堆)
代码实现:
def sift(li, low, height):
i = low
j = 2 * i + 1
tmp = li[i]
while j <= height:
if j + 1 <= height and li[j] < li[j + 1]:
j += 1
if li[j] > tmp:
li[i] = li[j]
i = j
j = 2 * i + 1
else:
break
li[i] = tmp
def heap_sort(li):
n = len(li) - 1
for i in range((n - 1) // 2, -1, -1):
sift(li, i, n)
for i in range(n, 0, -1):
li[0], li[i] = li[i], li[0]
sift(li, 0, i - 1)
算法效率:
时间复杂度:O(nlog2n)
空间复杂度:O(1)
待续
标签:right,复杂度,元素,li,算法,源码,排序,left 来源: https://www.cnblogs.com/mress/p/16683853.html