赞
踩
目录
常见排序算法
冒泡排序代码如下:
- """
- 作者:佩大奇
- 日期:2022/03/05/
- 描述:冒泡排序:n个元素的排序需要走n-1趟循环,每一趟都能确定一个有序元素,无序元素会减少一个,直到n-1次后,n个元素去拿不变成有序的
- new_knowledge:生成随机数:import random li=[random.randint(0,1000) for i in range(1000)]
- """
- #这是升序
- def bubble_ascending_order(li):
- for n in range(len(li)-1):#趟数
- exchange=False
- for i in range(len(li)-n-1):#无序区范围
- if li[i] > li[i+1]:
- li[i], li[i+1] = li[i+1], li[i]
- exchange=True
- # tem=li[i]
- # li[i]=li[i+1]
- # li[i+1]=tem
- # 或者 if exchange == False:
- # print("排序完成,列表是个有序序列")
- # break
- if not exchange:#避免中途列表已经排序完成依然进行循环排序
- print("排序完成,列表是个有序列表")
- break
- print(li)
- print("--------该列表冒泡排序升序的结果为:-------")
- print(li)
-
-
-
- #这是降序
- def bubble_Descending(li):
- for n in range(len(li)-1):
- exchange=False
- for i in range(len(li)-n-1):
- if li[i]<li[i+1]:
- li[i] , li[i+1] = li[i+1] , li[i]
- exchange=True
- if not exchange:
- print("排序完成,列表是个有序列表")
- break
- print(li)
- print("该列表降序的结果为:")
- print(li)
-
- print("请输入列表元素:")
- li=list(input().split())
- for i in range(len(li)):
- li[i]=int(li[i])
- print("你输入的列表为:")
- print(li)
- print("通过冒泡排序,该列表的升序的过程为:")
-
- bubble_ascending_order(li)
-
- print()
- print("----------------------------------------")
- print("该列表冒泡排序降序的过程为:")
- bubble_Descending(li)
选择排序代码如下:
- """
- 作者:佩大奇
- 日期:2022/03/05/
- 描述:选择排序:每遍历一次都能找到一个最小的值,每次查找后,将最小值放在第一位,第二个最小值放在第二位,以此类推
- 例子:查找最小的k个元素
- """
- def select(li):
- print("请输入你要查找的元素个数")
- n=int(input())
- if n >len(li):
- print("你要查找的元素个数有误")
- else:
- for i in range(len(li)-1):#无序区的开始位置(范围就是整个列表)
- # 因为每一趟都能查找到一个最小的数,那么最后一趟就不需要遍历了,
- # 因为最后一趟就只有一个元素,那么就是只有一个元素了,就是最大的,使用可以不需要遍历判断它
- for j in range(i+1,len(li)):#每次遍历查找都是从无序区(就是i+1)开始,也可以和i开始,因为python中的区间是前闭后开的,所以如果从i开始就是i和i进行比较(因为此时的j==i)
- #每一次查找都需要将每个元素进行对比
- if li[i] > li[j]:
- #假设最小数是无序区的开始i位置,然后无序区的开始位置与后面的无序区元素相互比较,然后后面的有比开始位置小的元素,那么和无序区开始位置相互交换
- #当满足需要查找最小元素的个数时,则停止循环结束,后面即使有一样的元素也不管,因为只需要查找k个最小元素
- # min=li[j]
- li[i] ,li[j] = li[j] , li[i]
- # print("----第",end="")
- # print(i,end="")
- # print("边查找,找到的最小的元素是:",end="")
- # print(min)
- print(li)#输出每次选择排序的过程
- print("选择排序后的列表:")
- print(li)
- print("查找到列表中最小的",end="")
- print(n,end="")
- print("个元素分别为:",end="")
- print("[",end="")
- for m in range(n):#遍历输出查找到的最小的k个元素,就是输出有序区的元素
- print(li[m],end=" ")
- print("]")
-
-
- print("请输入你的列表,元素间用空格隔开:")
- li=list(input().split())
- for i in range(len(li)):
- li[i]=int(li[i])
- print("你输入的列表为:")
- print(li)
- select(li)
-
-
插入排序的代码如下:
- """
- 作者:佩大奇
- 日期:2022/03/06/
- 描述:插入排序:相当于扑克牌的插牌。
- 无序区的元素i和有序区的元素比较,无序区开始位置的元素和有序区的所有元素比较,
- 当无序区的开始位置比有序区中的某个元素小时,那么在所有比无序区开始元素大的有序区元素都向后移动一位,
- 其中移动范围是有序区中的某个元素比无序区中的开始位置的元素小的位置的后一位开始到无序区的开始位置,
- """
- def insert(li):
- for i in range(1,len(li)):#从无序区遍历
- j=i-1#i可以表示为前i张排,那么第i张开始是抽牌(即无序区),那么减1就是表示减去第i张就是无序区的排(抽牌),即有序区的范围遍历
- temp = li[i]
- while j>-1 and li[j]>temp:
- #这里不能是li[j]>li[i],因为有序区和每一次的li[i]判断是,都不是一开始无序区的li[i]
- #应为i是要每一次有序区循环判断一次后才会改变值,因此在有序区判断过程中i是固定的,使用每一次判断的值都有误,只有temp在有序区
- #判断过程是永远保持不变的,插入时导入也是原来无序区的li[i]
- li[j+1]=li[j]
- j=j-1
- else:
- li[j+1]=temp
- print("插入排序的过程为:",end="")
- print(li)
- print("-----------------------------------------")
- print("插入排序的结果为:",end="")
- print(li)
-
- print("请输入你列表中的元素,用空格隔开:")
- li=list(input().split())
- for i in range(len(li)):
- li[i]=int(li[i])
- print("你输入的列表是:",end="")
- print(li)
- print("------插入排序结果和过程-------")
- insert(li)
- """
- 作者:佩大奇
- 日期:2022/03/09/
- 描述:快速排序
- """
- def partition(li,left,right):
- i = left
- j = right
- if i < j:#前提
- temple = li[left]
- while i < j:#循环次数
- while i < j and li[j] > temple:
- j -=1
- if i < j :#避免第n次调用途中right全部值都小于temple,直到超过i的值才有小于temple的值
- li[i] = li[j]
- i +=1
- while i < j and li[i] < temple:
- i +=1
- if i < j:
- li[j]=li[i]
- j -=1
- li[i]=temple
- partition(li,left,i-1)#递归调用
- partition(li,i+1,right)
-
-
- li=[i for i in range(20)]
- import random
- random.shuffle(li)
- print("随机生成的列表是:",end="")
- print(li)
- partition(li,0,len(li)-1)
- print("快速排序的结果:",end="")
- print(li)
-
得到堆顶的元素,为最大元素
去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序
堆顶元素为第二大元素
重复步骤,直到堆变空
堆排序代码如下(不使用递归):
- """
- 作者:佩大奇
- 日期:2022/03/09/
- 描述:堆排序(不使用递归)
- 堆排序主要使先建立堆,然后通过挨个出数的方法进行堆排序
- """
- def sift(li,low,height):
- i=low#i移动父节点指针,一开始位于堆顶
- j=2*i+1#j移动子节点指针
- temp=li[low]#存放堆顶元素
- while j <=height:#针对于一棵二叉树而言,每次调整是针对一个子树,多个子树组成一棵二叉树
- if j+1 <=height and li[j] <li[j+1]: #j+1<=height说明有右孩子,li[j]<li[j+1]说明右孩子大于左孩子
- j=j+1 #j指针移向右孩子
- if li[j] >temp:
- li[i]=li[j]#把li[j]的值赋值给li[i]
- i=j#i指针移动下一层,即i指针移动至刚刚赋值后空缺位置的那一层
- j=2*i+1#j指针移动下一层
- else:
- li[i]=temp#当j指向的值比temp小的时候,则temp继续赋值i位置,这仅是针对于一棵子树而言
- break
- li[i]=temp #当j>height时候,那么说明也不存在比temp小的值
-
- def heap(li):
- n=len(li)-1#节点个数
- #1.先建堆
- for i in range((n-1)//2,-1,-1):#这里是走父节点
- sift(li,i,n)#这里的height最后一个节点是n,是因为不管是哪棵子树,只有他有孩子,
- # 那么他的孩子下标一定小于等于height,如果不存在孩子,那么j到下一层时候j的值就会超过height,只要超过了height就说明他没有孩子
- print("建立堆的结果:",end="")
- print(li)
-
- #2.挨个出数,成为有序序列
- for i in range(n,-1,-1):#这里的出数是对于所有节点而言的,因此开始是n,结束是左后一个元素,因为出数的过程是将堆顶元素(最大的值)和
- #最后一个元素交换,然后height界限向前移动,因为,最后相当于将最大值有后往前放,因此交换最后一个元素,
- li[0] , li[i] =li[i] , li[0]
- sift(li,0,i-1)#这里调用调整函数sift(),height就是i-1,使每一次最大值放后面后,height就往前移动,往前移动后,刚刚的最大值位置就不属于堆里的内容了
- print("堆排序的结果:",end="")
- print(li)
-
-
- li=[i for i in range(10)]
- import random
- random.shuffle(li)
- print(li)
- heap(li)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。