排序

冒泡排序

代码示例:

def sort(alist):
    length = len(alist)
    for j in range(0,length-1):
        for i in range(0,length-1-j):
            if alist[i] > alist[i+1]:
                alist[i],alist[i+1] = alist[i+1],alist[i]


a = [8,3,5,7,6]
sort(a)
print(a)

选择排序

  选择排序改进了冒泡排序,每次遍历列表只做一次交换。为了做到这一点,一个选择排序在他遍历时寻找最大的值,并在完成遍历后,将其放置在正确的位置。

def sort(alist):
    length = len(alist)
    for j in range(length-1,0,-1):
        #最大值元素的下标
        max_index = 0
        for i in range(1,j+1):
            if alist[max_index] < alist[i]:
                max_index = i
        alist[max_index],alist[j] = alist[j],alist[max_index]

a = [8,3,51,7,6]
sort(a)
print(a)

 对于冒泡排序来讲选择排序由于交换数量的减少,选择排序通常在基准研究中执行得更快

插入排序

插入排序的主要思想是每次取一个列表元素与列表中已经排序好的列表段进行比较,然后插入从而得到新的排序好的列表段,最终获得排序好的列表。比如,待排序列表为[49,38,65,97,76,13,27,49],则比较的步骤和得到的新列表如下:(带有背景颜色的列表段是已经排序好的,红色背景标记的是执行插入并且进行过交换的元素)

代码示例

def sort(alist):
    length = len(alist)
    for j in range(1,length):
        i = j  # i就是无序列表中的第一个元素
        while i > 0:
            if alist[i] < alist[i-1]:
                alist[i],alist[i-1] = alist[i-1],alist[i]
                i -= 1
            else:
                break

alist = [33,38,49,97,76,13,27]
sort(alist)
print(alist)

希尔排序

   希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本,该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高

 

def sort(alist):
    gap = len(alist) // 2
    while gap >= 1:
        for j in range(gap,len(alist)):
            i = j
            while i > 0:
                if alist[i] < alist[i-gap]:
                    alist[i],alist[i-gap] = alist[i-gap],alist[i]
                    i -= gap
                else:
                    break
        gap = gap // 2


alist = [3,8,5,7,6,1,99]
sort(alist)
print(alist)

快速排序

def sort(alist,start,end):
    low = start
    high = end
    if low >= high:
        return
    mid = alist[low]
    while low < high:
        while low < high:  
            if alist[high] >= mid:
                high -= 1
            else:
                alist[low] = alist[high]
                break

        while low < high:         
            if alist[low] < mid:
                low += 1
            else:
                alist[high] = alist[low]
                break

    alist[low] = mid  ####
    #在mid左侧列表中递归调用该函数
    sort(alist,start,low-1)
    #mid右侧
    sort(alist,high+1,end) 


alist = [31,8,5,7,6]
sort(alist,0,len(alist)-1)
print(alist)
原文地址:https://www.cnblogs.com/wanglan/p/10896714.html