1.排序算法(学习自用)

打印 上一主题 下一主题

主题 968|帖子 968|积分 2904

1.冒泡排序

算法步调

相邻的元素之间对比,每次早出最大值或最小值放到最后或前面,所以形象的称为冒泡。
特点

n个数排序则举行n轮,每轮比力n-i次。所以时间复杂度为O(n^2),空间复杂度为O(1),该排序算法稳固。
代码模板

  1. n = int(input())
  2. a = list(map(int, input().split()))
  3. for i in range(1, n-1):
  4.     for j in range(0, n - i):
  5.         if a[j] > a[j + 1]:
  6.             a[j], a[j + 1] = a[j + 1], a[j]
  7. print(' '.join(map(str, a)))
复制代码
2.选择排序

算法步调

从左往右找到最小元素,放在起始位置。依次找到第i个位置的元素。
特点

n个数排序有n个位置,每轮比力n-i次。所以时间复杂度为O(n^2),空间复杂度为O(1),该排序算法稳固。
代码模板

  1. n = int(input())
  2. a = list(map(int, input().split()))
  3. for i in range(0, n-1):
  4.     min_val = a[i]
  5.     min_id = i
  6.     for j in range(i, n):
  7.         if a[j] < min_val:
  8.             min_val = a[j]
  9.             min_id = j
  10.     a[i], a[min_id] = a[min_id], a[i]
  11. print(' '.join(map(str, a)))
复制代码
3.插入排序

算法步调

第一个元素看做已排序,从左往右遍历每一个元素。在已排序元素中从后往前扫描:假如当前元素大于新元素,则钙元素移动到后一位。
简朴来说,对第i个元素从i向左到i-1找合适的位置插入。
特点

n个数排序则举行n轮插入,每轮比力i次。所以时间复杂度为O(n^2),空间复杂度为O(1),该排序算法不稳固。
代码模板

  1. n = int(input())
  2. a = list(map(int, input().split()))
  3. for i in range(1, n):
  4.     value = a[i]
  5.     insert_id = 0
  6.     for j in range(i - 1, -1, -1):
  7.         if a[j] > value:
  8.             a[j + 1] = a[j]
  9.         else:
  10.             insert_id = j + 1
  11.             break
  12.     a[insert_id] = value
  13. print(' '.join(map(str, a)))
复制代码
4.快速排序

算法步调

找一个基准值x,把列表分为三部分:小于等于x的数、x、大于x的数字。左部分和右部分递归使用该计谋。
特点

时间复杂度为O(n log(n)),空间复杂度为O(n log(n)),该排序算法不稳固。
代码模板

  1. def partition(a, left, right):
  2.     id = left + 1
  3.     for i in range(left + 1, right + 1):
  4.         if a[i] <= a[left]:
  5.             a[id], a[i] = a[i], a[id]
  6.             id += 1
  7.     a[left], a[id - 1] = a[id - 1], a[left]
  8.     return id - 1
  9. def quicksort(a, left, right):
  10.     if left < right:
  11.         mid = partition(a, left, right)
  12.         quicksort(a, left, mid - 1)
  13.         quicksort(a, mid + 1, right)
  14. n = int(input())
  15. a = list(map(int, input().split()))
  16. quicksort(a, 0 , n - 1)
  17. print(' '.join(map(str, a)))
复制代码
5.归并排序

算法步调

先把数组分成两部分,每部分递归处置惩罚酿成有序,将两个有序列表合并起来。
代码模板

  1. n = int(input())
  2. a = list(map(int, input().split()))
  3. def merge(A,B):
  4.     result = []
  5.     while len(A)!=0 and len(B)!=0:
  6.         if A[0] <= B[0]:
  7.             result.append(A.pop(0))
  8.         else:
  9.             result.append(B.pop(0))
  10.     result.extend(A)
  11.     result.extend(B)
  12.     return result
  13. def mergesort(A):
  14.     if len(A)<2:
  15.         return A
  16.     mid = len(A)//2
  17.     left =mergesort(A[:mid])
  18.     right = mergesort(A[mid:])
  19.     return merge(left, right)
  20. print(' '.join(map(str, mergesort(a))))
复制代码
6.桶排序

算法步调

利用函数映射关系,将输入数据分到有限的桶里,然后每个通分别排序:
(1)初始化k个桶
(2)遍历数据,将数据放入到对应桶中
(3)每个桶单独排序
(4)各个桶的数据拼接起来
代码模板



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表