1.冒泡排序

相信冒泡排序是很多小伙伴第一个知道的排序算法。它就是每趟排序冒出一个最大(最小)值,相邻两个元素比较,前一个比后一个大,则交换。

  1. def bubbleSort(arr):
  2. n = len(arr)
  3. # 遍历所有数组元素
  4. for i in range(n):
  5. # Last i elements are already in place
  6. for j in range(0, n-i-1): #j+1等于最后一位
  7. if arr[j] < arr[j+1] :
  8. arr[j], arr[j+1] = arr[j+1], arr[j]
  9. arr = [63, 34, 35, 32, 22, 11, 90]
  10. bubbleSort(arr)
  11. print ("排序后的数组:")
  12. for i in range(len(arr)):
  13. print ("%d" %arr[i]),

现在是从大到小,从小到大只需要把arr[j] < arr[j+1] : 改成arr[j] arr[j+1] :

写成ACM形式:

  1. arr=input().strip()
  2. arr_1=[int(n) for n in arr.split()]
  3. def Bubblesort(arr):
  4. n=len(arr)
  5. for i in range(n):
  6. for j in range(0,n-i-1):
  7. if arr[j]>arr[j+1]:
  8. arr[j],arr[j+1]=arr[j+1],arr[j]
  9. Bubblesort(arr_1)
  10. print(arr_1)

2.快速排序

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。

步骤为:

  • 挑选基准值:从数列中挑出一个元素,称为"基准"(pivot);
  • 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成;
  • 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。

递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。

  1. 前后指针法的单趟排序的基本步骤如下:
  2. 1.选出一个key作为比较值,一般是最左或者最右边。让prev指向leftcur指向left+1
  3. 2.之后比较cur位置的值和key的值,首先要保证cur位置的值要小于key,而且++prev!=cur,这时交换prevcur位置对应的值,不管满不满足这两个条件,cur都要++,这样才能迭代起来。
  4. 3.直到cur越界,此时prevkey应该在的位置,此时交换prev位置的值和key,就可以达到我们想要的效果。
  5. 4.仍然是递归其左序列和右序列,最终整个序列有序。
  1. def partition(arr,low,high):
  2. i = ( low-1 ) # 最小元素索引
  3. pivot = arr[high]
  4. for j in range(low , high):
  5. # 当前元素小于或等于 pivot 从小到大排序,从大到小换一下arr[j] >= pivot
  6. if arr[j] <= pivot:
  7. i = i+1
  8. arr[i],arr[j] = arr[j],arr[i]
  9. arr[i+1],arr[high] = arr[high],arr[i+1] #向前移动一次
  10. return ( i+1 )
  11. # arr[] --> 排序数组
  12. # low --> 起始索引
  13. # high --> 结束索引
  14. # 快速排序函数
  15. def quickSort(arr,low,high):
  16. if low < high:
  17. pi = partition(arr,low,high)
  18. quickSort(arr, low, pi-1) #递归求解先左边在右边
  19. quickSort(arr, pi+1, high)
  20. arr = [1, 8, 2, 7, 3, 6,5]
  21. n = len(arr)
  22. quickSort(arr,0,n-1)
  23. print ("排序后的数组:")
  24. for i in range(n):
  25. print ("%d" %arr[i]),

1.1 对于TOP-K问题快速排序解法:


  1. # arr1=input()
  2. # arr=[int(n) for n in arr1.split() ]
  3. import numpy as np
  4. def partition(arr,low,high):
  5. i = ( low-1 ) # 最小元素索引
  6. pivot = arr[high]
  7. for j in range(low , high):
  8. # 当前元素小于或等于 pivot 从小到大排序,从大到小换一下arr[j] >= pivot
  9. if arr[j] >= pivot:
  10. i = i+1
  11. arr[i],arr[j] = arr[j],arr[i]
  12. arr[i+1],arr[high] = arr[high],arr[i+1] #向前移动一次
  13. return ( i+1 )
  14. # arr[] --> 排序数组
  15. # low --> 起始索引
  16. # high --> 结束索引
  17. # 快速排序函数
  18. def quickSort(arr,low,high,k):
  19. # if (k > 0 and k <= high - low + 1): #k取值有限制
  20. pi = partition(arr,low,high)
  21. if pi>k-1:
  22. return quickSort(arr, low, pi-1,k) #递归求解先左边在右边
  23. elif pi<k-1:
  24. return quickSort(arr, pi+1, high,k)
  25. else:
  26. return arr[pi]
  27. arr = [1, 8, 2, 7, 3, 6,5,7,8,9,7,6]
  28. n = len(arr)
  29. c=quickSort(arr,0,n-1,2)
  30. print(c)
  31. print ("排序后的数组:")
  32. for i in range(n):
  33. print ("%d" %arr[i]),

关键点在于把第k大的数在数组中进行比较,这里通过快速排序的思想,TopK小于当前的中枢轴下标,那么向左走,反之,若是中枢轴下标等于TopK的值,直接返回即可。原理其实并不难,下面有一处地方需注意,当TopK的值大于中枢轴下标时,需要向右走,每一次需要减去之前的中枢轴下标,可以通过下面自己所画的图理解。

常用排序方法——python写法【冒泡、快速排序、TOP-K问题】的更多相关文章

  1. 经典排序方法 python

    数据的排序是在解决实际问题时经常用到的步骤,也是数据结构的考点之一,下面介绍10种经典的排序方法. 首先,排序方法可以大体分为插入排序.选择排序.交换排序.归并排序和桶排序四大类,其中,插入排序又分为 ...

  2. Python实现的常用排序方法

    1.冒泡排序,相邻位置比较大小,将比较大的(或小的)交换位置 def maopao(a):     for i in range(0,len(a)):         for j in range(0 ...

  3. js常用的2中排序方法:冒泡排序和快速排序

    冒泡排序:例如9 4 5 6 8 3 2 7 10 1 首先:9和4比较  4放前   4 9 5 6 8 3 2 7 10 1 4和5比较   4不动   4 9 5 6 8 3 2 7 10 1 ...

  4. 排序算法Python(冒泡、选择、快速、插入、希尔、归并排序)

    排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们通常所说的排序算法往往指的是内部排序算法,即数据 ...

  5. 矩阵或多维数组两种常用实现方法 - python

    在python中,实现多维数组或矩阵,有两种常用方法: 内置列表方法和numpy 科学计算包方法. 下面以创建10*10矩阵或多维数组为例,并初始化为0,程序如下: # Method 1: list ...

  6. 九大常用排序算法 python

    1.冒泡排序 import random from timewrap import * @cal_time def bubble_sort(li): for i in range(len(li)-1) ...

  7. HashMap和TreeMap的常用排序方法

    一.简单描述 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,HashTable以及LinkedHashMap等. TreeMap:能够把它保存的记录根据键(key)排序 ...

  8. 排序方法——python

    1.冒泡排序法(Bubble Sort) 比较相邻的元素.如果第一个比第二个大,就交换它们两个: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数: 针对所 ...

  9. java常见排序方法

    1.java常用排序方法 1) 选择排序         原理:a. 将数组中的每个元素,与第一个元素比较          如果这个元素小于第一个元素, 就将这个         两个元素交换.   ...

  10. 经典面试问题: Top K 之 ---- 海量数据找出现次数最多或,不重复的。

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

随机推荐

  1. 多种方式实现 Future 回调返回结果

    JDK  实现 public class FutureTest { public static void main(String[] args) throws Exception { Executor ...

  2. 【Redis】哈希类型 列表类型 集合类型 有序集合 慢查询 pipeline与事务 发布订阅 Bitmap位图 HyperLogLog

    目录 昨日回顾 今日内容 1 哈希类型 2 列表类型 3 集合类型 4 有序集合(zset) 5 慢查询 6 pipeline与事务 7 发布订阅 8 Bitmap位图 9 HyperLogLog 作 ...

  3. 【QT Tools】软件多语言国际化翻译的方法与步骤

    在Qt的项目开发过程中,有时软件要翻译成多语言版本,这就涉及到国际化方面的操作.虽然Qt对这方面集成了很多工具,操作起来比较方便,本文还是总结一下国际化的方法和步骤,用以备忘和参考. 我们通常在写程序 ...

  4. Eight HDU - 1043 (反向搜索 + 康拓展开 / A* + BFS / IDA* )

    题目描述 简单介绍一下八数码问题: 在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 8 在上图中,由于右下角位置是空的,你可以移动数字,比如可以将数字 ...

  5. Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D)

    补题链接:Here 1511A. Review Site 题意:\(n\) 个影评人,\(a_i\) 有三种类型,如下 \(a_i = 1\) ,则表示支持 \(a_i = 0\) ,则表示不支持 \ ...

  6. 【译】 双向流传输和ASP.NET Core 3.0上的gRPC简介

    原文相关 原文作者:Eduard Los 原文地址:https://medium.com/@eddyf1xxxer/bi-directional-streaming-and-introduction- ...

  7. apicloud(沉浸式导航篇) - 手机状态栏 有黑边的解决办法

    在 index.html 的  apiready 中加上 第一种 : 可设置全屏 api.setFullScreen({          fullScreen: true   }); 第二种:设置状 ...

  8. Qt5.9 UI设计(二)——最简Qt工程搭建

    前言 前面一章已经介绍了QT的开发环境的安装,这里介绍一下一个最简工程的搭建 操作步骤 新建项目 选择带界面的Qt Widgets Application 设置项目位置 注意这里的目录不能有中文路径 ...

  9. IBM jca 工具的学习与整理

    IBM jca 工具的学习与整理 背景 发现自己最早看到IBM这个工具的时间是 2022年9月份. 但是一直没有进行过仔细的学习与论证. 本周出现了一个问题. 虽然通过gclog明显看出来是一个oom ...

  10. 阿里云ECS自建K8S_IPV6重启后异常问题解决过程

    阿里云ECS自建K8S_IPV6重启后异常问题解决过程 背景 最近安装了一个单节点的K8S_IPV6 昨天不知道何故 突然宕机了. 然后只能在阿里云的控制台后台重启了ECS 启动之后看K8S的状态一开 ...