Python学习30——排序算法3

5.简单选择排序

  1. 初始状态:无序区为R[1…n],有序区为空;
  2. 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录
    R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
  3. n-1趟结束,数组有序化了。
    简单选择排序同样对数据操作n-1轮,每轮找出一个最大(小)值。
    操作指选择,即未排序数逐个比较交换,争夺最值位置,每轮将一个未排序位置上的数交换成已排序数,即每轮选一个最值。
    每轮操作O(n)次,共O(n)轮,时间复杂度O(n^2)。
    额外空间开销出在交换数据时那一个过渡空间,空间复杂度O(1)。
    代码:
def xuanze(lst):
    n=len(lst)
    if n<=1:
        return lst
    for i in range(0,n-1):
        min=i
        for j in range(i+1,n):
            if lst[j]<lst[min]:
                min=j
        if min!=i:
            lst[min],lst[i]=lst[i],lst[min]
    return lst
x=input('请输入待排序序列:\n')
y=x.split()
arr=[]
for i in y:
    arr.append(int(i))
arr=xuanze(arr)
print('数列排序如下:')
for i in arr:
    print(i,end=' ')

结果:

请输入待排序序列:
12 14 5 16 9 20 3 7
数列排序如下:
3 5 7 9 12 14 16 20 
Process finished with exit code 0

6.堆排序
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:

  1. 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  2. 按增量序列个数k,对序列进行k 趟排序;
  3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。
    希尔排序是插入排序的高效实现(大家可以比对一下插入排序和希尔排序的代码),对简单插入排序减少移动次数优化而来。
    简单插入排序每次插入都要移动大量数据,前后插入时的许多移动都是重复操作,若一步到位移动效率会高很多。
    若序列基本有序,简单插入排序不必做很多移动操作,效率很高。
    希尔排序将序列按固定间隔划分为多个子序列,在子序列中简单插入排序,先做远距离移动使序列基本有序;逐渐缩小间隔重复操作,最后间隔为1时即简单插入排序。
    希尔排序对序列划分O(n)次,每次简单插入排序O(logn),时间复杂度O(nlogn)
    额外空间开销出在插入过程数据移动需要的一个暂存,空间复杂度O(1)
    代码:
def ShellSort(lst):
    def shellinsert(arr,d):
        n=len(arr)
        for i in range(d,n):
            j=i-d
            temp=arr[i]             #记录要出入的数
            while(j>=0 and arr[j]>temp):    #从后向前,找打比其小的数的位置
                arr[j+d]=arr[j]                 #向后挪动
                j-=d
            if j!=i-d:
                arr[j+d]=temp
    n=len(lst)
    if n<=1:
        return lst
    d=n//2
    while d>=1:
        shellinsert(lst,d)
        d=d//2
    return lst
 
 
x=input("请输入待排序数列:\n")
y=x.split()
arr=[]
for i in  y:
    arr.append(int(i))
arr=ShellSort(arr)
#print(arr)
print("数列按序排列如下:")
for i in arr:
    print(i,end=' ')

结果:

请输入待排序数列:
12 10 15 9 5 7 4 3 1
数列按序排列如下:
1 3 4 5 7 9 10 12 15 
Process finished with exit code 0

少年不被楼层误,余生不羁尽自由。
加油,加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值