数据结构——用python实现排序算法

用python实现各种数据结构,是不是EXCITING?本文实现了基础排序算法

代码较为简单,按顺序如下:

1.插入排序

#coding=utf8
L=[223, 85, 232, 171, 215, 229, 12, 58, 219, 143, 61, 152, 32, 42, 199, 82, 252, 217, 106, 240, 202, 40, 180, 292, 235, 214, 116, 76, 298, 33, 132, 185, 44, 31, 73, 110, 201, 174, 127, 108, 251, 83, 172, 36, 93, 88, 233, 218, 30, 18, 262, 293, 263, 277, 100, 48, 246, 98, 75, 170, 138, 278, 134, 297, 78, 226, 206, 176, 28, 133, 203, 50, 222, 123, 230, 285, 105, 189, 238]
'''
Created on 2016年10月2日

@author: sx
'''
def charu(L):
    m=0
    g=0
    print(len(L))
    for i in range(1,len(L)):
        m=m+1
        x=L[i]
        j=i
        while j>0 and L[j-1]>x:
            m=m+1
            L[j]=L[j-1]
            j=j-1
            g=g+1
        L[j]=x
    print(L)
    print(m,g,m+g)
 #方法简单直接又暴力,不错不错   

charu(L)

2、冒泡排序

#encoding=UTF-8
'''
Created on 2016年10月2日

@author: sx
'''
L=[223, 85, 232, 171, 215, 229, 12, 58, 219, 143, 61, 152, 32, 42, 199, 82, 252, 217, 106, 240, 202, 40, 180, 292, 235, 214, 116, 76, 298, 33, 132, 185, 44, 31, 73, 110, 201, 174, 127, 108, 251, 83, 172, 36, 93, 88, 233, 218, 30, 18, 262, 293, 263, 277, 100, 48, 246, 98, 75, 170, 138, 278, 134, 297, 78, 226, 206, 176, 28, 133, 203, 50, 222, 123, 230, 285, 105, 189, 238]
# def suiji(i):
def maopao(L):
    m=0
    for i in range(0,len(L)):
        m=m+1
        for j in range(i+1,len(L)):
            m=m+1
            if L[i]>L[j]:
                print(L[i],L[j])
                swap(L,i,j)
                print(L)
                m=m+1
    print(m)
#     冒泡排序好像打擂台
def swap(L,i,j):
    q=L[j]
    L[j]=L[i]
    L[i]=q


maopao(L)

3、冒泡排序优化算法

#encoding=UTF-8
'''
Created on 2016年10月2日

@author: sx
'''
import random
L=[223, 85, 232, 171, 215, 229, 12, 58, 219, 143, 61, 152, 32, 42, 199, 82, 252, 217, 106, 240, 202, 40, 180, 292, 235, 214, 116, 76, 298, 33, 132, 185, 44, 31, 73, 110, 201, 174, 127, 108, 251, 83, 172, 36, 93, 88, 233, 218, 30, 18, 262, 293, 263, 277, 100, 48, 246, 98, 75, 170, 138, 278, 134, 297, 78, 226, 206, 176, 28, 133, 203, 50, 222, 123, 230, 285, 105, 189, 238]
# def suiji(i):
#     s=[]
#     for i in range(0,i):
#         q=random.randint(10,300)
#         if q not in s:
#             s.append(q)
#     print(s)

def maopao(L):
    m=0
    g=0
    for i in range(0,len(L)):
        m=m+1
        for j in range(-len(L)+1,-i):
            m=m+1
            k=-j
#             if L[k]<L[i]:
#                 print(L[i],L[k])
#                 swap(L,i,k)
#                 print(L)
#                 m=m+1
            o=k-1
            if L[k]<L[o]:
                print(L[j],L[o])
                swap(L,j,o)
                print(L)
                g=g+1
    print(m,g)
#     冒泡排序好像打擂台
def swap(L,i,j):
    q=L[j]
    L[j]=L[i]
    L[i]=q

maopao(L)

4、冒泡排序再优化

#encoding=UTF-8
'''
Created on 2016年10月2日

@author: sx
'''
import random
L=[223, 85, 232, 171, 215, 229, 12, 58, 219, 143, 61, 152, 32, 42, 199, 82, 252, 217, 106, 240, 202, 40, 180, 292, 235, 214, 116, 76, 298, 33, 132, 185, 44, 31, 73, 110, 201, 174, 127, 108, 251, 83, 172, 36, 93, 88, 233, 218, 30, 18, 262, 293, 263, 277, 100, 48, 246, 98, 75, 170, 138, 278, 134, 297, 78, 226, 206, 176, 28, 133, 203, 50, 222, 123, 230, 285, 105, 189, 238]
# def suiji(i):
#     s=[]
#     for i in range(0,i):
#         q=random.randint(10,300)
#         if q not in s:
#             s.append(q)
#     print(s)

def maopao(L):
    m=0
    f=1
    g=0
    for i in range(0,len(L)):
        if f==1: 
            m=m+1
            f=0
            for j in range(-len(L)+1,-i):
                m=m+1
                k=-j
                o=k-1
                if L[k]<L[o]:
                    print(L[i],L[o])
                    swap(L,o,k)
                    f=1
                    print(L)
                    g=g+1
                elif L[k]==L[o]:
                    f=1
        else:
            pass
    print(m,g)
#    考虑一种情况 局部调整结束
def swap(L,i,j):
    q=L[j]
    L[j]=L[i]
    L[i]=q

maopao(L)

5、希尔排序

'''
Created on 2016年10月2日

@author: sx
'''
L=[223, 85, 232, 171, 215, 229, 12, 58, 219, 143, 61, 152, 32, 42, 199, 82, 252, 217, 106, 240, 202, 40, 180, 292, 235, 214, 116, 76, 298, 33, 132, 185, 44, 31, 73, 110, 201, 174, 127, 108, 251, 83, 172, 36, 93, 88, 233, 218, 30, 18, 262, 293, 263, 277, 100, 48, 246, 98, 75, 170, 138, 278, 134, 297, 78, 226, 206, 176, 28, 133, 203, 50, 222, 123, 230, 285, 105, 189, 238]
def ShellSort(L):
    t=len(L)
    m=0
    g=0
    while(t>1):
        t=int(t/12+1)
        i=0
        m=m+1
        while i<len(L):
            m=m+1
#                 print(i)
            x=L[i]
            j=i
            while j>0 and L[j-t]>x:
                m=m+1
                g=g+1
                L[j]=L[j-t]
                j=j-t
#             while L[i]<L[i+t]:
#                 L[i]=L[i+t]
#             print(L)
            L[j]=x
            i=i+t
#             print(L)
    print(m,g,m+g)
ShellSort(L)

小慧慧还在睡觉~

6、选择排序

#encoding=UTF-8
'''
Created on 2016年10月2日

@author: sx
'''
L=[223, 85, 232, 171, 215, 229, 12, 58, 219, 143, 61, 152, 32, 42, 199, 82, 252, 217, 106, 240, 202, 40, 180, 292, 235, 214, 116, 76, 298, 33, 132, 185, 44, 31, 73, 110, 201, 174, 127, 108, 251, 83, 172, 36, 93, 88, 233, 218, 30, 18, 262, 293, 263, 277, 100, 48, 246, 98, 75, 170, 138, 278, 134, 297, 78, 226, 206, 176, 28, 133, 203, 50, 222, 123, 230, 285, 105, 189, 238]
# def suiji(i):
L=[2,3,12,34,52,1,45]
def xuanze(L):
    print(len(L))
    m=0
    g=0
    for i in range(0,len(L)):
        min=i
        m=m+1
        for j in range(i+1,len(L)):
            m=m+1
            if L[min]>L[j]:
                min=j
                m=m+1
        if min!=i:
            swap(L,i,min)
            print(L)
            g=g+1
    print(m,g)
#     选择排序和冒泡排序的不同:选择排序只需交换一次,冒泡排序需要比较且交换多次,选择排序比较的较多
def swap(L,i,j):
    q=L[j]
    L[j]=L[i]
    L[i]=q    
xuanze(L)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值