把无序列表[37,99,73,48,47,40,40,25,99,51]升序排序。

一、冒泡法

冒泡法属于交换排序,从第一个开始,两两比较,交换位置,如同水泡向上冒,每轮比较会把当前最大值推到列表尾部,每轮确定一个数的位置。直到确定每一个数的位置。时间复杂度O(n**2)。
代码实现:
def buble(lst):
    lenth = len(lst)
    for i in range(lenth):
        for j in range(lenth-i-1):
            if lst[j]>lst[j+1]:
                lst[j],lst[j+1] = lst[j+1],lst[j]
    return lst

优化:如果发现一轮比较完成之后一次交换都没有发生没有发生,说明顺序已正确,无需再交换。代码:

def buble(lst):
    lenth = len(lst)
    for i in range(lenth):
        flag = False
        for j in range(lenth-i-1):
            if lst[j]>lst[j+1]:
                lst[j],lst[j+1] = lst[j+1],lst[j]
                flag = True
        else:
            if flag == False:
                break
        print(lst)
    return lst

二、简单选择排序

简单选择排序属于选择排序,从第一个开始遍历,找到本次遍历的极值放置在固定的位置,这个固定位置一般是指某一端。(通过比较记录最大数的索引,然后通过索引固定最大数在某一端,然后剩下数比较),时间复杂度O(n**2)

上代码:

def select(lst):
    lenth = len(lst)
    for i in range(lenth):
        minindex = i
        for j in range(i+1,lenth):
            if lst[minindex]>lst[j]:
                minindex = j
        if minindex != i:
            lst[minindex],lst[i] = lst[i],lst[minindex]
        print(lst)
    return lst

三、插入排序

插入算法是稳定排序算法。
使用在小规模数据比较。非常适用于新元素加入已排列好的list。
原理(升序):认为第一个数为一个有顺序的List,从第2个数开始取值i,取到之后与它前面的数比较,比i大该数则右移,直到找不到比i大的数,把i插入到循环停止的位置。
每一轮结束,都会得到一个从开始到待比较数位置的有序序列。

上代码:

def insert(lst):
    lenth = len(lst)
    for i in range(1,lenth):
        val = lst[i]
        j = i-1
        while val < lst[j] and j>=0:
            lst[j+1] = lst[j]
            j -= 1
        lst[j+1] = val
        print(lst)
    return lst

四、堆排序

待完善

 

 

posted on 2018-10-20 19:46  flysck  阅读(203)  评论(0)    收藏  举报