• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

爱女王,爱生活

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Python排序算法

不觉已经有半年没写了,时间真是容易荒废,这半年过了个春节,去拉萨旅行。本职工作也很忙,没有开展系统的学习和总结。

今年开始静下心来从基础开始学习,主要分为三部分,算法、线性代数、概率统计。

首先学习算法,用Python语言实现,主要是为了了解其中的思想,毕竟现成的轮子很多了。接下来学习线性代数和概率统计,主要通过日本的那两本书学习,编程实现方面从数值分析开始学习,也许要用到MATLAB。

算法,学习的书籍是《python算法教程》,涵盖的知识比较全,缺点是需要有一定的基础,我是先看了这本书,又看了《程序员的数学》(这个看起来太轻松了),然后对里面的思想有了感性的认识,但是具体到算法,还是很难写出来的,所以想把书中涉及到的问题,代码,都自己实现一遍,作为复习。

先从最简单的排序开始,可以从头撸到尾,也可以反过来,可以写成递归,也可以写成循环。

1. 从头撸到尾,就是选出小的,放到最前面。

递归

 1 def sort_f(seq,i):
 2     if i==0:
 3         return
 4     sort_f(seq,i-1)
 5     j=i
 6     while j>0 and seq[j-1]>seq[j]:
 7         seq[j],seq[j-1]=seq[j-1],seq[j]
 8         j-=1
 9 
10 seq = [9,8,7,6,5,4,3,2,1]
11 
12 -------------------------------------------------------
13 
14 >>> sort_f(seq,len(seq)-1)
15 >>> seq
16 [1, 2, 3, 4, 5, 6, 7, 8, 9]

循环

def sort_f2(seq):
    for i in range(len(seq)):
        for j in range(i,len(seq)):
            if seq[j]<seq[i]:
                seq[i],seq[j]=seq[j],seq[i]

 

2.从尾撸到头,就是选出最大的,放到最后

递归

def sort_e(seq,i):
    if i==0:
        return
    sort_e(seq,i-1)
    j = i
    while j>0 and seq[j]<seq[j-1]:
        seq[j],seq[j-1]=seq[j-1],seq[j]
        j-=1

递归或者这样写

def sort_ee(seq,i):
    if i==0:
        return
    maxj=i
    for j in range(i):
        if seq[j]>seq[maxj]:
            maxj=j
    seq[i],seq[maxj]=seq[maxj],seq[i]
    sort_ee(seq,i-1)

 循环

def sort_e2(seq):
    i=len(seq)-1
    while i>0:
        for j in range(i):
            if seq[j]>seq[i]:
                seq[i],seq[j]=seq[j],seq[i]
        i-=1

 

还有一些其它好玩的排序算法

3.侏儒排序

def gnomesort(seq):
    i=0
    while i<len(seq):
        if i==0 or seq[i-1]<seq[i]:
            i+=1
        else:
            seq[i-1],seq[i]=seq[i],seq[i-1]
            i-=1

 

4.归并排序

def mergesort(seq):
    mid = len(seq)//2
    lft = seq[:mid]
    rgt = seq[mid:]
    if len(lft)>1: lft = mergesort(lft)
    if len(rgt)>1: rgt = mergesort(rgt)
    res=[]
    while lft and rgt:
        if lft[-1]>=rgt[-1]:
            res.append(lft.pop())
        else:
            res.append(rgt.pop())
    res.reverse()
    return (lft or rgt) + res

 

posted on 2016-07-05 12:50  爱女王,爱生活  阅读(320)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3