问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python使用冒泡排序

发布网友 发布时间:2022-04-07 05:43

我来回答

2个回答

懂视网 时间:2022-04-07 10:04

python排序算法有哪些?下面本篇文章给大家介绍一下Python十大经典排序算法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

现在很多的事情都可以用算法来解决,在编程上,算法有着很重要的地位,将算法用函数封装起来,使程序能更好的调用,不需要反复编写。

Python十大经典算法:

一、插入排序

1.算法思想

从第二个元素开始和前面的元素进行比较,如果前面的元素比当前元素大,则将前面元素 后移,当前元素依次往前,直到找到比它小或等于它的元素插入在其后面,

然后选择第三个元素,重复上述操作,进行插入,依次选择到最后一个元素,插入后即完成所有排序。

2.代码实现

def insertion_sort(arr):
 #插入排序
 # 第一层for表示循环插入的遍数
 for i in range(1, len(arr)):
 # 设置当前需要插入的元素
 current = arr[i]
 # 与当前元素比较的比较元素
 pre_index = i - 1
 while pre_index >= 0 and arr[pre_index] > current:
  # 当比较元素大于当前元素则把比较元素后移
  arr[pre_index + 1] = arr[pre_index]
  # 往前选择下一个比较元素
  pre_index -= 1
 # 当比较元素小于当前元素,则将当前元素插入在 其后面
 arr[pre_index + 1] = current
 return arr

二、选择排序

1.算法思想

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

2.代码实现

def selection_sort(arr):
 #选择排序
 # 第一层for表示循环选择的遍数
 for i in range(len(arr) - 1):
 # 将起始元素设为最小元素
 min_index = i
 # 第二层for表示最小元素和后面的元素逐个比较
 for j in range(i + 1, len(arr)):
  if arr[j] < arr[min_index]:
  # 如果当前元素比最小元素小,则把当前元素角标记为最小元素角标
  min_index = j
 # 查找一遍后将最小元素与起始元素互换
 arr[min_index], arr[i] = arr[i], arr[min_index]
 return arr

三、冒泡排序

1.算法思想

从第一个和第二个开始比较,如果第一个比第二个大,则交换位置,然后比较第二个和第三个,逐渐往后,经过第一轮后最大的元素已经排在最后,

所以重复上述操作的话第二大的则会排在倒数第二的位置。,那重复上述操作n-1次即可完成排序,因为最后一次只有一个元素所以不需要比较。

2.代码实现

def bubble_sort(arr):
 #冒泡排序
 # 第一层for表示循环的遍数
 for i in range(len(arr) - 1):
 # 第二层for表示具体比较哪两个元素
 for j in range(len(arr) - 1 - i):
  if arr[j] > arr[j + 1]:
  # 如果前面的大于后面的,则交换这两个元素的位置
  arr[j], arr[j + 1] = arr[j + 1], arr[j]
 return arr

四、快速排序

1.算法思想

找出基线条件,这种条件必须尽可能简单,不断将问题分解(或者说缩小规模),直到符合基线条件。

2.代码实现

def quick_sort(arr):
 if len(arr) < 2:
 # 基线条件:为空或只包含一个元素的数组是“有序”的
 return arr
 else:
 # 递归条件
 pivot = arr[0]
 # 由所有小于基准值的元素组成的子数组
 less = [i for i in arr[1:] if i <= pivot]
 # 由所有大于基准值的元素组成的子数组
 greater = [i for i in array[1:] if i > pivot]
 return quicksort(less) + [pivot] + quicksort(greater)

print(quick_sort([10, 5, 2, 3]))

五、归并排序

1.算法思想

归并排序是分治法的典型应用。分治法(pide-and-Conquer):将原问题划分成 n 个规模较小而结构与原问题相似的子问题;递归地解决这些问题,然后再合并其结果,就得到原问题的解,分解后的数列很像一个二叉树。

具体实现步骤:

  1. 使用递归将源数列使用二分法分成多个子列

  2. 申请空间将两个子列排序合并然后返回

  3. 将所有子列一步一步合并最后完成排序

  4. 注:先分解再归并

2.代码实现

def merge_sort(arr):
 #归并排序
 if len(arr) == 1:
 return arr
 # 使用二分法将数列分两个
 mid = len(arr) // 2
 left = arr[:mid]
 right = arr[mid:]
 # 使用递归运算
 return marge(merge_sort(left), merge_sort(right))


def marge(left, right):
 #排序合并两个数列
 result = []
 # 两个数列都有值
 while len(left) > 0 and len(right) > 0:
 # 左右两个数列第一个最小放前面
 if left[0] <= right[0]:
  result.append(left.pop(0))
 else:
  result.append(right.pop(0))
 # 只有一个数列中还有值,直接添加
 result += left
 result += right
 return result

六、希尔排序

1.算法思想

希尔排序的整体思想是将固定间隔的几个元素之间排序,然后再缩小这个间隔。这样到最后数列就成为了基本有序数列。

具体步骤:

  1. 计算一个增量(间隔)值

  2. 对元素进行增量元素进行比较,比如增量值为7,那么就对0,7,14,21…个元素进行插入排序

  3. 然后对1,8,15…进行排序,依次递增进行排序

  4. 所有元素排序完后,缩小增量比如为3,然后又重复上述第2,3步

  5. 最后缩小增量至1时,数列已经基本有序,最后一遍普通插入即可

2.代码实现

def shell_sort(arr):
 #希尔排序
 # 取整计算增量(间隔)值
 gap = len(arr) // 2
 while gap > 0:
 # 从增量值开始遍历比较
 for i in range(gap, len(arr)):
  j = i
  current = arr[i]
  # 元素与他同列的前面的每个元素比较,如果比前面的小则互换
  while j - gap >= 0 and current < arr[j - gap]:
  arr[j] = arr[j - gap]
  j -= gap
  arr[j] = current
 # 缩小增量(间隔)值
 gap //= 2
 return arr

七、基数排序

1.算法思想

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

2.代码实现

2.1由桶排序改造,从最低位到最高位依次桶排序,最后输出最后排好的列表。

def RadixSort(list,d):
 for k in range(d):#d轮排序
 # 每一轮生成10个列表
 s=[[] for i in range(10)]#因为每一位数字都是0~9,故建立10个桶
 for i in list:
  # 按第k位放入到桶中
  s[i//(10**k)%10].append(i)
 # 按当前桶的顺序重排列表
 list=[j for i in s for j in i]
 return list

2.2简单实现

from random import randint
def radix_sort():
 A = [randint(1, 99999999) for _ in xrange(9999)]
 for k in xrange(8):
 S = [ [] for _ in xrange(10)]
 for j in A:
 S[j / (10 ** k) % 10].append(j)
 A = [a for b in S for a in b]
 for i in A:
 print i

八、计数排序

1.算法思想

对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x 放在它在输出数组上的位置上了,运行时间为O(n),但其需要的空间不一定,空间浪费大。

2.代码实现

from numpy.random import randint
def Conuting_Sort(A):
 k = max(A)  # A的最大值,用于确定C的长度
 C = [0]*(k+1) # 通过下表索引,临时存放A的数据
 B = (len(A))*[0] # 存放A排序完成后的数组
 for i in range(0, len(A)):
 C[A[i]] += 1 # 记录A有哪些数字,值为A[i]的共有几个
 for i in range(1, k+1):
 C[i] += C[i-1] # A中小于i的数字个数为C[i]
 for i in range(len(A)-1, -1, -1):
 B[C[A[i]]-1] = A[i] # C[A[i]]的值即为A[i]的值在A中的次序
 C[A[i]] -= 1 # 每插入一个A[i],则C[A[i]]减一
 return B

九、堆排序

1.算法思想

堆分为最大堆和最小堆,是完全二叉树。堆排序就是把堆顶的最大数取出,将剩余的堆继续调整为最大堆,具体过程在第二块有介绍,以递归实现 ,

剩余部分调整为最大堆后,再次将堆顶的最大数取出,再将剩余部分调整为最大堆,这个过程持续到剩余数只有一个时结束。

2.代码实现

import time,random
def sift_down(arr, node, end):
 root = node
 #print(root,2*root+1,end)
 while True:
 # 从root开始对最大堆调整
 child = 2 * root +1 #left child
 if child > end:
  #print('break',)
  break
 print("v:",root,arr[root],child,arr[child])
 print(arr)
 # 找出两个child中交大的一个
 if child + 1 <= end and arr[child] < arr[child + 1]: #如果左边小于右边
  child += 1 #设置右边为大
 if arr[root] < arr[child]:
  # 最大堆小于较大的child, 交换顺序
  tmp = arr[root]
  arr[root] = arr[child]
  arr[child]= tmp
  # 正在调整的节点设置为root
  #print("less1:", arr[root],arr[child],root,child)
  root = child #
  #[3, 4, 7, 8, 9, 11, 13, 15, 16, 21, 22, 29]
  #print("less2:", arr[root],arr[child],root,child)
 else:
  # 无需调整的时候, 退出
  break
 #print(arr)
 print('-------------')
 
def heap_sort(arr):
 # 从最后一个有子节点的孩子还是调整最大堆
 first = len(arr) // 2 -1
 for i in range(first, -1, -1):
 sift_down(arr, i, len(arr) - 1)
 #[29, 22, 16, 9, 15, 21, 3, 13, 8, 7, 4, 11]
 print('--------end---',arr)
 # 将最大的放到堆的最后一个, 堆-1, 继续调整排序
 for end in range(len(arr) -1, 0, -1):
 arr[0], arr[end] = arr[end], arr[0]
 sift_down(arr, 0, end - 1)
 #print(arr)

十、桶排序

1.算法思想

为了节省空间和时间,我们需要指定要排序的数据中最小以及最大的数字的值,来方便桶排序算法的运算。

2.代码实现

#桶排序
def bucket_sort(the_list):
 #设置全为0的数组
 all_list = [0 for i in range(100)]
 last_list = []
 for v in the_list:
 all_list[v] = 1 if all_list[v]==0 else all_list[v]+1
 for i,t_v in enumerate(all_list):
 if t_v != 0:
  for j in range(t_v):
  last_list.append(i)
 return last_list

总结:

在编程中,算法都是相通的,算法重在算法思想,相当于将一道数学上的应用题的每个条件,区间,可能出现的结果进行分解,分步骤的实现它。算法就是将具体问题的共性抽象出来,将步骤用编程语言来实现。通过这次对排序算法的整理,加深了对各算法的了解,具体的代码是无法记忆的,通过对算法思想的理解,根据伪代码来实现具体算法的编程,才是真正了解算法。

推荐学习:Python视频教程

热心网友 时间:2022-04-07 07:12

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。
def bubbleSort(arr):
n = len(arr)

# 遍历所有数组元素
for i in range(n):

# Last i elements are already in place
for j in range(0, n-i-1):

if arr[j] > arr[j+1] :
arr[j], arr[j+1] = arr[j+1], arr[j]

arr = [64, 34, 25, 12, 22, 11, 90]

bubbleSort(arr)

print ("排序后的数组:")
for i in range(len(arr)):
print ("%d" %arr[i])
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
未订阅苹果music自动扣款 分隔符和分页符的区别 提速快是看马力还是扭力 马力大提速快还是扭矩大提速快 体脂秤不准确怎样重新调试 为什么TVB连续剧里面的警察全部是西九龙重案组的? 为什么tvb电视剧中出现的警察经常是“西九龙重案组”的? 单相电表箱哪家公司口碑好? 牛郎织女人物形象 失题(末缺)(李颀)拼音版、注音及读音 简述科学的本质和特点 那个苹果笔记本的苹果系统恢复,一直显示正在搜索TIME MACHINE备份,怎么办 泰式椰奶咖喱面怎么做? mac升级后能通过timemachine恢复出厂设置吗 通过时间机器备份的iphone数据怎么恢复 macbook没有timemachine备份怎么回复 椰奶椰菜花汤怎么做 请介绍下椰奶咖哩炖菜的经典做法? 18650锂电池充电器哪家好? 椰奶炖雪蛤怎么做 椰奶咖喱鸡怎么做 mac time machine 可以恢复之前的系统吗 最好的18650锂电池是什么品牌的 时间机器用不了,用了无法加密,可以加密又进不去? 18650锂电池哪家好?哪个品牌靠谱? 椰奶鸡肉做法 18650锂电池 三洋和松下的那个好? 1英亩等于多少亩? 0.25英亩相当多少平方米 1acre是多少平方米 一英亩换算成中国的亩,大概是几亩地? 如何把一份word图片打印成上下左右四小份一样的出来 在coreldraw里把一张图片分成四份打印出来,因为图片比较大 支付宝上怎么没有申请代领 求SFC重装机兵R的金手指,是7E开头的 谁知道安卓重装机兵回归金手指代码 重装机兵金手指怎么使用 重装机兵1金手指怎么用 重装机兵r回归升级作弊码 孩子厌学怎办? 突然厌学甚至厌世怎么办? 孩子有厌学的情绪,该如何消除孩子的这一情绪? 孩子厌学厌世家长怎么办 孩子厌世厌学情绪不好怎么办 梦见家里停了一辆黄色的吸粪车? 梦见抽粪车抽粪水,怎么也抽不干净,粪池里面还在往上涨,什么意思? 梦见父亲掏自己的大粪,掏了一车好多桶,弄了一院子,然后又一桶桶的抱着去倒,但没看见他倒哪去就醒了 烩菜的会怎么写 我爱家乡的烩菜的作文怎么写 长城的简笔画 简单一点 急急急 行楷,博山烩菜怎么写