算法(插入、希尔、冒泡)

算法学习技巧
先问自己几个问题
什么是什么?
为什么要这么写?
稳定性?
时间复杂度?


冒泡排序
是什么:首先拿到第1个元素,和它第二个比较,较大的放右边;第二个与第三个比,一直重复下去 ,最后一个就是最大的数
为什么:总共有n个数,主要是控制轮数,第二个是控制次数。比的次数 为:n-1
稳定性
时间复杂度
方法一:
def Bubble(arr):
    for i in range(len(arr)):
        for j in range(len(arr)-1-i):
            if arr[j]>arr[j+1]:
                arr[j],arr[j+1]=arr[j+1],arr[j]
    return arr

arr=[9,3,6,2,0,6]
print(Bubble(arr))

>>> arr=[9,3,6,2,0,6]
>>> print(Bubble(arr))
[0, 2, 3, 6, 6, 9]

方法二:
def Bubble(arr):
    i=0
    while i<len(arr):
        print("当前为第%s轮"%i+"***********************************")
        for j in range(len(arr)-1-i):
            if arr[j]>arr[j+1]:
                arr[j],arr[j+1]=arr[j+1],arr[j]
                print("当前的值得为:",(arr[j],arr[j+1]))
        i+=1
    return arr

arr=[9,3,6,2,0,6]
print(Bubble(arr))


方法三:
def Bubble(arr):
    i=0
    while i<len(arr):
        print("当前为第%s轮"%(i+1)+"***********************************")
        j=len(arr)-1-i
        while j<i:
            if arr[j]>arr[j+1]:
                arr[j],arr[j+1]=arr[j+1],arr[j]
                #print("当前的值得为:",(arr[j],arr[j+1]))
                print("当前的数组为:",arr)
            j+=1
        i+=1
    return arr

arr=[9,3,6,2,0,6]
print(Bubble(arr))

>>> def Bubble(arr):
...     i=0
...     while i<len(arr):
...         print("当前为第%s轮"%(i+1)+"***********************************")
...         j=len(arr)-1-i
...         while j<i:
...             if arr[j]>arr[j+1]:
...                 arr[j],arr[j+1]=arr[j+1],arr[j]
...                 #print("当前的值得为:",(arr[j],arr[j+1]))
...                 print("当前的数组为:",arr)
...             j+=1
...         i+=1
...     return arr
...
>>> arr=[9,3,6,2,0,6]
>>> print(Bubble(arr))
当前为第1轮***********************************
当前为第2轮***********************************
当前为第3轮***********************************
当前为第4轮***********************************
当前的数组为: [9, 3, 2, 6, 0, 6]
当前为第5轮***********************************
当前的数组为: [9, 2, 3, 6, 0, 6]
当前的数组为: [9, 2, 3, 0, 6, 6]
当前为第6轮***********************************
当前的数组为: [2, 9, 3, 0, 6, 6]
当前的数组为: [2, 3, 9, 0, 6, 6]
当前的数组为: [2, 3, 0, 9, 6, 6]
当前的数组为: [2, 3, 0, 6, 9, 6]
当前的数组为: [2, 3, 0, 6, 6, 9]
[2, 3, 0, 6, 6, 9]
>>>
插入排序
方法一
def insertSort(arr):
    for i in range(1,len(arr)):
        for j in range(i,0,-1):
            if arr[j-1]>arr[j]:
                arr[j-1],arr[j]=arr[j],arr[j-1]
    return arr

arr=[9,3,6,2,0,6]
print(insertSort(arr))
...
>>> arr=[9,3,6,2,0,6]
>>> print(insertSort(arr))
[0, 2, 3, 6, 6, 9]
>>>



方法二
def insertSort(arr):
    for i in range(1,len(arr)):
        for j in range(0,i):
            if arr[j]>arr[i]:#这里j的位置比I要前面,因为i是从0开始
                arr[j],arr[i]=arr[i],arr[j]
    return arr

arr=[9,3,6,2,0,6]
print(insertSort(arr))
>>> arr=[9,3,6,2,0,6]
>>> print(insertSort(arr))
[0, 2, 3, 6, 6, 9]
>>>

方法三:
def insertSort(arr):
    i=1
    while i<len(arr):
        value=arr[i]
        j=i-1
        while j>=0:
            if arr[j]>value:#这里j的位置比I要前面,因为i是从0开始
                arr[j+1],arr[j]=arr[j],arr[j+1]
            j-=1
        i+=1   
    return arr

arr=[9,3,6,2,0,6]
print(insertSort(arr))
>>> arr=[9,3,6,2,0,6]
>>> print(insertSort(arr))
[0, 2, 3, 6, 6, 9]