基本排序算法:Python实现

简介: 基本排序算法,包括冒泡排序,插入排序,选择排序,堆排序,快速排序等。   【冒泡排序】 复杂度是n*n #coding:utf8 #author:HaxtraZ #description:冒泡排序 def bubblesort1(a): #每次找到一个最小元素,放到数...

基本排序算法,包括冒泡排序,插入排序,选择排序,堆排序,快速排序等。

 

【冒泡排序】

复杂度是n*n

#coding:utf8
#author:HaxtraZ
#description:冒泡排序


def bubblesort1(a):
    #每次找到一个最小元素,放到数组首部
    n=len(a)
    for i in range(0,n-1):
        swapped=False
        for j in range(n-1,i,-1):
            if a[j]<a[j-1]:
                a[j],a[j-1]=a[j-1],a[j]
                swapped=True
        if not swapped: break


def bubblesort2(a):
    #这个版本的解释,在谭浩强C++2004版P137
    #每次找到一个最大元素并放到数组末尾
    #边界处做了优化
    n=len(a)
    for i in range(0,n-1):
        swapped=False
        for j in range(0, n-i-1):
            if a[j]>a[j+1]:
                a[j],a[j+1]=a[j+1],a[j]
                swapped=True
        if not swapped: break


def bubblesort3(a):
    #这个版本来自维基百科
    #外层循环本来有点问题的,如果是range(len(a)-1,1,-1)
    #那么当输入数据为3,5,1时,结果不正确
    #当然,维基百科上这个错误我已经修改过了。
    for j in range(len(a)-1, 0, -1):
        for i in range(0, j):
            if a[i]>a[i+1]:
                a[i],a[i+1]=a[i+1],a[i]

  

【插入排序】

复杂度是n*n

#coding:utf8
#author:HaxtraZ


def insertion_sort1(a):
#线性插入排序
    for j in range(1, len(a)):
        key = a[j]
        i = j - 1
        while i>=0 and a[i]>key:
            a[i+1] = a[i]
            i = i-1
        a[i+1] = key

def binInsertSort(a):
#二分插入排序
    n = len(a)
    for j in range(1, n):
        key = a[j]
        i = j - 1

        if key > a[i]:
            continue
        l, r = 0, i
        while l <= r:
            #print l, r
            mid = (l + r) / 2
            if key < a[mid]:
                r = mid - 1
            else:
                l = mid + 1
        k = j
        while k > l:
            a[k] = a[k - 1]
            k = k - 1

        a[l] = key

  

【选择排序】

复杂度是n*n

#coding:utf8
#author:HaxtraZ
#description:选择排序


def selectsort1(a):
    #每次找最小元素
    n=len(a)
    for i in range(0, n-1):
        for j in range(i+1, n):
            minpos=i #minpos用于记录最小元素的下标
            if a[j]<a[minpos]:
                minpos=j
                #如果在这里就交换a[j]和a[minpos],那就是bubblesort

        if minpos!=i:
            a[minpos],a[i]=a[i],a[minpos]


def selectsort2(a):
    #每次找最大元素
    n=len(n)
    for i in range(n-1, 0, -1):
        maxpos=0
        for j in range(1, i+1):
            if a[j]>a[maxpos]:
                maxpos=j

        if maxpos!=i:
            a[i],a[maxpos]=a[maxpos],a[i]

  

【堆排序】

复杂度是nlogn

#coding:utf8
#author:HaxtraZ
#description:堆排序
#修改自《算法导论》2nd Edition


def LEFT(i):
    return 2*i+1


def RIGHT(i):
    return 2*i+2


def PARENT(i):
    return (i-1)/2


def MAX_HEAPIFY(a,i,heapsize):
    l=LEFT(i)
    r=RIGHT(i)
    if l<heapsize and a[l]>a[i]:
        largest=l
    else:
        largest=i

    if r<heapsize and a[r]>a[largest]:
        largest=r

    if largest!=i:
        a[i],a[largest]=a[largest],a[i]
        MAX_HEAPIFY(a,largest,heapsize)


def BUILD_MAX_HEAP(a):
    heapsize=len(a)
    i=PARENT(len(a)-1)
    while i>=0:
        MAX_HEAPIFY(a,i,heapsize)
        i -= 1


def HEAP_SORT(a):
    BUILD_MAX_HEAP(a)
    n=len(a)
    heapsize=n
    for i in range(n-1, 0, -1):
        a[0],a[i]=a[i],a[0]
        heapsize-=1
        MAX_HEAPIFY(a,0,heapsize)


a=[1,3,2,4,8,6,22,9]
HEAP_SORT(a)
print a

  

【快速排序】

复杂度是nlogn

#coding:utf8
#version1
'''参考自http://interactivepython.org/courselib/static/pythonds/SortSearch/sorting.html'''


def quickSort(alist):
   quickSortHelper(alist,0,len(alist)-1)

def quickSortHelper(alist,first,last):
   if first<last:

       splitpoint = partition(alist,first,last)

       quickSortHelper(alist,first,splitpoint-1)
       quickSortHelper(alist,splitpoint+1,last)


def partition(alist,first,last):
   pivotvalue = alist[first]

   leftmark = first+1
   rightmark = last

   done = False
   while not done:

       while leftmark <= rightmark and \
               alist[leftmark] <= pivotvalue:
           leftmark = leftmark + 1

       while alist[rightmark] >= pivotvalue and \
               rightmark >= leftmark:
           rightmark = rightmark -1

       if rightmark < leftmark:
           done = True
       else:
           temp = alist[leftmark]
           alist[leftmark] = alist[rightmark]
           alist[rightmark] = temp

   temp = alist[first]
   alist[first] = alist[rightmark]
   alist[rightmark] = temp


   return rightmark

alist = [54,26,93,17,77,31,44,55,20]
quickSort(alist)
print(alist)

  

目录
相关文章
|
2天前
|
算法 数据可视化 Python
Python用MCMC马尔科夫链蒙特卡洛、拒绝抽样和Metropolis-Hastings采样算法
Python用MCMC马尔科夫链蒙特卡洛、拒绝抽样和Metropolis-Hastings采样算法
12 6
|
2天前
|
机器学习/深度学习 算法 搜索推荐
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
30 12
|
8天前
|
算法 数据可视化 Python
Python贝叶斯推断Metropolis-Hastings(M-H)MCMC采样算法的实现
Python贝叶斯推断Metropolis-Hastings(M-H)MCMC采样算法的实现
12 0
|
8天前
|
数据可视化 算法 数据挖掘
PYTHON实现谱聚类算法和改变聚类簇数结果可视化比较
PYTHON实现谱聚类算法和改变聚类簇数结果可视化比较
|
9天前
|
算法 数据可视化 Python
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
14 0
|
9天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
19 0
|
10天前
|
缓存 算法 Python
python算法对音频信号处理Sonification :Gauss-Seidel迭代算法
python算法对音频信号处理Sonification :Gauss-Seidel迭代算法
|
13天前
|
算法 数据可视化 数据挖掘
使用Python实现DBSCAN聚类算法
使用Python实现DBSCAN聚类算法
154 2
|
14天前
|
存储 算法 安全
Python加密算法有哪些?有什么作用?
这些加密算法的作用在于保护敏感数据的隐私和完整性。它们可以用于数据传输、存储、身份验证和数字签名等领域。通过加密,可以确保数据在传输和存储过程中不被未经授权的人访问或篡改。同时,数字签名可以用于验证数据的来源和完整性,防止数据被篡改或冒充。不同的加密算法在不同的应用场景中起到不同的作用,选择合适的算法取决于安全需求和性能要求。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
8 0
|
15天前
|
算法 数据可视化 数据挖掘
使用Python实现K均值聚类算法
使用Python实现K均值聚类算法
18 1