五种排序算法python语言实现

1.冒泡排序

思想: 依次循环遍历,没什么好说的,循环就完事了。每个数据都需要排列,i表示当前位置元素,第j个元素需要对比元素个数,n-1-i表示每行需要对比的最多次数,冒泡排序时间复杂度为O(n²)

def bubbleSort(list,n):
    if n <= 1:
        return list
    for i in range(n):  #表示行
        flag = False        #表示是否有数据交换
        for j in range(n-1-i):  #表示每行的下标
            if list[j] > list[j+1]:
                list[j],list[j+1] = list[j+1],list[j]
                flag = True
        if flag == False:
            break
    return list


list = [8,1,9,3,4,2,6,7]
n = len(list)

f = bubbleSort(list,n)

运行结果:

 

2.插入排序

思想:插入排序的工作方式就像许多人排列手中扑克牌一样。一般都是右手去拿桌子上的牌面向下的牌,然后从牌堆上拿走一张牌并将它插入左手中正确的位置. 为了找到这张牌的正确位置,一般都是将它与已在手中的每张牌进行比较,拿在左手中的牌总是排序好的. 时间复杂度为O(n²)

def insertSort(list,n):
    if n <= 1:
        return list
    for i in range(1,n):        #未排序区间
        value = list[i]
        for j in range(i,-1,-1):    #排序过程
            if value < list[j-1]:       #如果value小于它前面的数。
                list[j] = list[j-1]     #就和它前面的数字换位置
            else:       #若没有,表示当前value为已排序区间最大值
                break
        list[j] = value
    return list

list1 = [1,9,4,23,11,56,8,43,6,7]
print(list1)
n = len(list1)

a = insertSort(list1,n)
print(a)

运行结果:

3.选择排序:

思想:原理同插入排序。也分已拍区间和未拍区间,选择排序会从每次未排序的区间中找到最小元素,将其放到已排序区间末尾 选择排序刚开始没有已排序,找到最小元素,放到开始。或者末尾.时间复杂度为O(n²)

def selectionSort(list):
    if len(list) <= 1:
        return list

    for i in range(len(list)-1):
        min_index = i       #记录最小位置
        for j in range(i+1,len(list)):
            if list[j] < list[min_index]:
                min_index = j
        if min_index != i:
            list[i],list[min_index] = list[min_index],list[i]
    return list

list1 = [1,9,4,23,11,56,8,43,6,7]
print(list1)
a = selectionSort(list1)
print(a)

运行结果:

4.归并排序:

思想:如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。 然后再将她们按照两个有序数组的样子合并起来。.时间复杂度为O(nlogn)

def merge(a, b):        #接受两个列表
    c = []      #定义了一个新列表
    h = j = 0   #两个变量
    while j < len(a) and h < len(b):    #当j<列表a的长度。当h小于列表b的长度
        if a[j] < b[h]:         #如果a的j小于b的h,c添加a[j],j再+1
            c.append(a[j])
            j += 1
        else:
            c.append(b[h])      #反言之c添加b[h],h+1
            h += 1

    if j == len(a): #当j到a的末尾了
        for i in b[h:]:     #列表c添加列表b从h位到末尾的值
            c.append(i)
    else:
        for i in a[j:]:     #反之列表c添加列表a从j位到末尾的值
            c.append(i)

    return c

def merge_sort(lists):
    if len(lists) <= 1:
        return lists
    middle = len(lists)//2  #将列表分成两份,放到merge中
    left = merge_sort(lists[:middle])
    right = merge_sort(lists[middle:])
    return merge(left, right)


if __name__ == '__main__':
    a = [14, 2, 34, 43, 21, 19]
    print(a)
    print (merge_sort(a))

运行结果:

5.快速排序:

思想:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。 时间复杂度:O(nlgn)

import random
def getrandata(num):
    a = []
    i = 0
    while i <num:
        a.append(random.randint(0,100))
        i += 1
    return a


def quicksort(num_list):
    lenth = len(num_list)
    if lenth <= 1:
        return num_list
    temp = random.randint(0,lenth-1)# 随便取的一个数,作为列表索引
    tempval = num_list[temp]
    left = []
    right = []
    for i in range(0,lenth):
        if num_list[i] > tempval:
            right.append(num_list[i])
        else:
            left.append(num_list[i])
    return quicksort(left)+quicksort(right)


if __name__ == '__main__':
    a = getrandata(10)
    print(a)
    b = quicksort(a)
    print(b)

运行结果:

希望能给后来学习的人一点启示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值