算法基础:冒泡-选择-插入排序

冒泡排序 

冒泡排序图解

冒泡排序代码

def bubble_sort(li):
    for i in range(len(li) - 1):
        for j in range(len(li) - i - 1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j] #大数在前面我就直接交换,只有python有这语法

冒泡排序-优化

 

冒泡排序-优化代码

def bubble_sort_1(li):
    for i in range(len(li) - 1):
        exchange = False
        for j in range(len(li) - i - 1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]  
                exchange = True
        if not exchange:
            break

i是多少趟

data =list(range(5))
random.shuffle(data) #把一个函数打乱
print(data)
bubble_sort(data)
print(data)

打印结果:

[2, 0, 1, 4, 3]
0
1
2
3

j是交换的次数

import random

def bubble_sort(li):
    for i in range(len(li) - 1):  #i是多少趟
        for j in range(len(li) - i - 1): #j交换的次数
		print(j)
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]  #大的在前面我就直接交换

data =list(range(5))

测试结果如下:

第一次交换
0
1
2
3
第二次交换
0
1
2
第三次交换
0
1
第四次交换
0

大数在前面我就直接交换,只有python有这语法

li[j], li[j+1] = li[j+1], li[j] 

如果想降序排列如何执行

1、代码

import random

def bubble_sort(li):
    for i in range(len(li)-1):  #第i趟
        for j in range(len(li)-i-1):
            if li[j] < li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
        print(li)


li = [9,8,7,1,2,3,4,5,6]
print(li)
bubble_sort(li)

2、输出结果

[9, 8, 7, 1, 2, 3, 4, 5, 6]
[9, 8, 7, 2, 3, 4, 5, 6, 1]
[9, 8, 7, 3, 4, 5, 6, 2, 1]
[9, 8, 7, 4, 5, 6, 3, 2, 1]
[9, 8, 7, 5, 6, 4, 3, 2, 1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]

打印排序过程

1、优化前

实现代码

import random

def bubble_sort(li):
    for i in range(len(li)-1):  #第i趟
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
        print(li)


li = [9,8,7,1,2,3,4,5,6]
print(li)
bubble_sort(li)

测试结果

[9, 8, 7, 1, 2, 3, 4, 5, 6]
[8, 7, 1, 2, 3, 4, 5, 6, 9]
[7, 1, 2, 3, 4, 5, 6, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

2、优化后

1、实现代码

import random

def bubble_sort(li):
    for i in range(len(li)-1):  #第i趟
        exchange = False
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
                exchange = True
        print(li)
        if not exchange:
            return


li = [9,8,7,1,2,3,4,5,6]
print(li)
bubble_sort(li)

2、测试结果

[9, 8, 7, 1, 2, 3, 4, 5, 6]
[8, 7, 1, 2, 3, 4, 5, 6, 9]
[7, 1, 2, 3, 4, 5, 6, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

优化前和优化后性能比较

import random
import time
import copy
import sys

def cal_time(func):
    def wrapper(*args, **kwargs):
        t1 = time.time()
        result = func(*args, **kwargs)
        t2 = time.time()
        print("%s running time: %s secs." % (func.__name__, t2 - t1))
        return result
    return wrapper

@cal_time
def bubble_sort(li):
    for i in range(len(li) - 1):  #i是多少趟
        for j in range(len(li) - i - 1): #j交换的次数
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]  #大的在前面我就直接交换

@cal_time
def bubble_sort_1(li):
    for i in range(len(li) - 1):
        exchange = False
        for j in range(len(li) - i - 1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
                exchange = True
        if not exchange:
            break

data = list((range(10000)))
random.shuffle(data)
bubble_sort(data)
bubble_sort_1(data)
print(data)

测试结果:

"C:\Program Files\Python35\python.exe" C:/python14/day06/3.py
bubble_sort running time: 10.17458200454712 secs.
bubble_sort_1 running time: 0.0009999275207519531 secs.

Process finished with exit code 0

选择排序

 选择排序思路核心思想

 选择排序代码

def select_sort(li):
    for i in range(len(li) - 1):
        min_loc = i
        for j in range(i+1,len(li)):
            if li[j] < li[min_loc]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]

 时间复杂度:O(n2)

import random
def select_sort(li):
    for i in range(len(li) - 1):
        print(i)
        min_loc = i
        for j in range(i+1,len(li)):
            print(j)
            if li[j] < li[min_loc]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]


data =list(range(5))
random.shuffle(data)  #把一个函数打乱
print(data)
select_sort(data)
print(data)

[3, 0, 2, 1, 4] 

[3, 0, 2, 1, 4]
0
1
2
3
4

1
2
3
4

2
3
4

3
4
[0, 1, 2, 3, 4]

[4, 0, 3, 2, 1]

[4, 0, 3, 2, 1]
0
1
2
3

4
1
2
3

4
2
3

4
3

4
[0, 1, 2, 3, 4]

打印排序过程

1、实现代码

def select_sort(li):
    for i in range(len(li)-1): # i是第几趟
        min_loc = i
        for j in range(i+1, len(li)):
            if li[j] < li[min_loc]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]
        print(li)

li = [3,4,2,1,5,6,8,7,9]
print(li)
select_sort(li)
#print(li)

2、测试结果

[3, 4, 2, 1, 5, 6, 8, 7, 9]
[1, 4, 2, 3, 5, 6, 8, 7, 9]
[1, 2, 4, 3, 5, 6, 8, 7, 9]
[1, 2, 3, 4, 5, 6, 8, 7, 9]
[1, 2, 3, 4, 5, 6, 8, 7, 9]
[1, 2, 3, 4, 5, 6, 8, 7, 9]
[1, 2, 3, 4, 5, 6, 8, 7, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

插入排序

插入排序思路

 

插入排序代码

def insert_sort(li):
    for i in range(1, len(li)):
        tmp = li[i]
        j = i - 1
        while j >= 0 and li[j] > tmp:
            li[j+1]=li[j]
            j = j - 1
        li[j + 1] = tmp

实际测试代码如下:

import random
def insert_sort(li):
    for i in range(1, len(li)):
        tmp = li[i]
        j = i - 1
        while j >= 0 and li[j] > tmp:
            print(j)
            li[j+1]=li[j]
            j = j - 1
        li[j + 1] = tmp

data = list(range(5))
random.shuffle(data)  #把一个函数打乱
print(data)
insert_sort(data)

  测试结果如下:

"C:\Program Files\Python35\python.exe" C:/python14/day06/5.py
[3, 0, 2, 4, 1]
0
1
3
2
1

[2, 1, 4, 3, 0]
0
2
3
2
1
0

[1, 3, 4, 2, 0]
2
1
3
2
1
0

[1, 0, 4, 3, 2]
0
2
3
2

打印排序过程

1、实现代码

def insert_sort(li):
    for i in range(1, len(li)): #i 表示摸到的牌的下标
        tmp = li[i]
        j = i - 1 #j指的是手里的牌的下标
        while j >= 0 and li[j] > tmp:
            li[j+1] = li[j]
            j -= 1
        li[j+1] = tmp
        print(li)



li = [3,2,4,1,5,7,9,6,8]
print(li)
insert_sort(li)
#print(li)

2、测试结果

[3, 2, 4, 1, 5, 7, 9, 6, 8]
[2, 3, 4, 1, 5, 7, 9, 6, 8]
[2, 3, 4, 1, 5, 7, 9, 6, 8]
[1, 2, 3, 4, 5, 7, 9, 6, 8]
[1, 2, 3, 4, 5, 7, 9, 6, 8]
[1, 2, 3, 4, 5, 7, 9, 6, 8]
[1, 2, 3, 4, 5, 7, 9, 6, 8]
[1, 2, 3, 4, 5, 6, 7, 9, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

  

 

 

posted @ 2018-06-12 09:07  活的潇洒80  阅读(230)  评论(0)    收藏  举报