当前位置:   article > 正文

蓝桥杯(1):python排序

蓝桥杯(1):python排序

1 基础

1.1 输出

1.1.1 去掉输出的空格

  1. print("Hello","World",123,sep="+")
  2. print("hello",'world',123,sep='')
  3. print('hello','world',123)
  4. #输出结果
  5. #Hello+World+123
  6. #helloworld123
  7. #hello world 123

 1.1.2 以不同的方式结尾

  1. print("Hello","World",123,sep="+",end='apple')
  2. print("hello",'world',123,sep='')
  3. print('hello','world',123)

1.2 输入

input 是字符串类型

1.3 常量变量运算符

int转bool:非0是TRUE,0是FALSE【0和FLASE一一对】

运算符://整除 %取余

关系运算符的结果:TRUE或FALSE!

2 冒泡排序

2.1 算法步骤

运行n-1次,每一次把最大的换到最后

时间复杂度:O(n^2) 空间复杂度:O(1)【没有用到新的空间,是在原来的空间上进行的】,稳定

2.2 代码实现

  1. n = int(input())
  2. a = list(map(int,input().split()))
  3. #循环n-1次,每次获得第i大
  4. for i in range(1,n):
  5. #每次比较a[j]和a[j+1]的大小,如果前面大就交换
  6. for j in range(0,n-i):
  7. if a[j]>a[j+1]:
  8. a[j],a[j+1]=a[j+1],a[j]
  9. #注意输出的格式要求:这里要求用空格隔开
  10. print(' '.join(map(str,a)))

3 选择排序

3.1 算法步骤

选择一个最小的放在最左边,核心:选择并储存最小值

时间复杂度:O(n^2),空间复杂度o(1),稳定

3.2 具体代码

  1. n = int(input())
  2. a = list(map(int,input().split()))
  3. for i in range(0,n-1):
  4. min_value = a[i]
  5. min_idx = i
  6. for j in range(0+i,n):
  7. if a[j] < min_value:
  8. min_value = a[j]
  9. min_idx = j
  10. #进行交换
  11. a[min_idx] = a[i]
  12. a[i]= min_value
  13. #或者写成 都可以哦!
  14. #a[min_idx],a[i] = a[i],a[min_idx]
  15. #print(a)
  16. print(' '.join(map(str,a)))

4 插入排序

4.1 算法步骤

相当于扑克牌排序

要做的是在一个有序的数组插入一个数字!

 

4.2 具体代码

  1. n = int(input())
  2. a = list(map(int,input().split()))
  3. for i in range(1,n):
  4. value = a[i]
  5. insert_idx = 0 #注意这个的设置比较重要,如果比到最后是最小的,则插入的位置是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_idx = j+1 #挪不动,说明这个值比a[j]大,则他应该在a[j+1]的位置上!
  11. break
  12. a[insert_idx] = value
  13. print(' '.join(map(str,a)))

5 快速排序

5.1 算法步骤

这时3的位置是一定正确的!

核心:怎么选基准,怎么分,怎么递归

5.2 具体代码

  1. #列表a,左端点为left,后端点为right
  2. def partition(a,left,right):
  3. stand = a[left]
  4. idx = left+1
  5. for i in range(left+1,right+1):
  6. if a[i]<stand:
  7. a[i],a[idx] = a[idx],a[i]
  8. idx = idx+1
  9. a[idx-1],a[left] = a[left],a[idx-1]
  10. #print(a)
  11. return idx-1
  12. def quicksort(a,left,right):
  13. if left<right:
  14. mix = partition(a,left,right)
  15. quicksort(a,left,mix-1)
  16. quicksort(a,mix+1,right)
  17. return a
  18. a = [5,3,8,1,2,9,4,7,6]
  19. left = 0
  20. right = 8
  21. print(quicksort(a,left,right))

 注意递归的规则是:一定要有结束条件!!!!!这就解释left<right存在的必要性!!!要不然就是死循环!!!

6 归并排序

6.1 算法步骤

6.2 具体代码

合并两个有序的列表,实际还是递归!!!

  1. # 归并排序
  2. # 第一步是变编写代码:合并两个有序的列表!!!!
  3. def Merge(A,B):
  4. c = []
  5. while len(A) !=0 and len(B)!= 0:
  6. if A[0] <= B[0]:
  7. c.append(A[0])
  8. A.pop(0)
  9. else:
  10. c.append(B[0])
  11. B.pop(0)
  12. c.extend(A)
  13. c.extend(B)
  14. return c
  15. def Mergesort(a):
  16. if len(a) < 2:
  17. return a
  18. else:
  19. mix = len(a) //2
  20. left = Mergesort(a[0:mix])
  21. right = Mergesort(a[mix:len(a)])
  22. a = Merge(left,right)
  23. return a
  24. n = int(input())
  25. a = list(map(int,input().split()))
  26. print(Mergesort(a))

7 桶排序

7.1 算法步骤

为了缩小问题规模!!!

7.2 具体代码

代码的最核心:分桶!!!

找到最大值和最小值,除以总的桶数

  1. def Bucket_sort(a,bucketcount):
  2. minvalue, maxvalue = min(a),max(a)
  3. bucketsize = (maxvalue-minvalue+1) // bucketcount #均匀的分开
  4. res = [[] for i in range(bucketcount+1)]#要多一个桶 放不能整除的那些数字
  5. #把所有的元素放在对应的桶里
  6. for i in a:
  7. idx = (i-minvalue) // bucketsize
  8. res[idx].append(i)
  9. ans = []
  10. for i in res:
  11. i.sort()
  12. ans = ans + i
  13. return ans
  14. n = int(input())
  15. a = list(map(int, input().split()))
  16. print(Bucket_sort(a,5))

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/244588
推荐阅读
相关标签
  

闽ICP备14008679号