算法基础

一、冒泡排序

我们来看下面这个程序:
  range(len(alist)-1,0,-1) 第一个参数是起始值,第二个参数是终止值,第三个参数是步长
  也就是生成0到len(alist)-1的数字,然后按照步长-1就是从大到小取值
  比如说range(10,5,-1) 第一次取10第二次取9第三次取8...最后一次也就是第五次取6(取不到5)
  第一次排序的时候我们需要比较数列长度len(alist)-1次,一个数列有n个数,我们需要拿它里面的数两个两个比较的话一共有n-1对
  数列中一共有7个数,1和4比较 4大 取4;然后4和7比较 7大 取7;7和3比较 7大 取7;7和6比较 7大 取7;7和9比较 9大 取9;9和9比较 9大 取9; 最后把9放在最后一位,第一次排序选出最大的数放在最后一位。
  第二次排序类似于上面第一次一样两个两个比较,取大的和后面的比较...到最后的时候不用和最后一位比较了,因为9是最大的已经放在最后一位了,所以只需要和倒数第二位比较就可以了。for i in range(item)已经帮我们做了这件事,每次排序比较的对数每次都会减一。

#Python的冒泡排序 
alist = [1,4,7,3,6,9,5]    
def func(alist):  
    for item in range(len(alist)-1,0,-1):   
        for i in range(item):  
            if alist[i]>alist[i+1]:     # 如果前一个数(a)比后一个数(b)大
                mid = alist[i]          # 把大数赋给中间变量(mid)
                alist[i] = alist[i+1]   # 把b(小数)放在前一个数(a)大数的位置上  
                alist[i+1] = mid        # 把中间变量存的大数放在b的位置上 完成一次排序
    return alist 
二、插入排序
第一次i循环
	l[0]依次和后面的6个数比较,小的数放在l[0]的位置上
第二次i循环
	l[1]依次和后面的5个数比较,小的数放在l[1]的位置上
第三次i循环
	l[2]依次和后面的4个数比较,小的数放在l[2]的位置上
第四次i循环
	l[3]依次和后面的3个数比较,小的数放在l[3]的位置上
第五次i循环
	l[4]依次和后面的2个数比较,小的数放在l[4]的位置上
第六次i循环
	l[5]依次和后面的1个数比较,小的数放在l[5]的位置上
	
l = [34, 16, 78, 2, 34, 56, 5]
for i in range(len(l)-1):           # 大循环6次

    for j in range(i+1, len(l)):    # 第一次range(1,6)  第二次range(2,6) 第三次range(3,6) ...

        if l[i] > l[j]:                

            l[i], l[j] = l[j], l[i]

print(l)
三、选择排序  
第一次i等于6时
	l[0]和它后面6个数比较,取大值得索引值,内层循环结束后然后把大值放在l[6]的位置
第二次i等于5时
	l[0]和它后面5个数比较,取大值得索引值,内层循环结束后然后把大值放在l[5]的位置
第三次i等于5时
	l[0]和它后面4个数比较,取大值得索引值,内层循环结束后然后把大值放在l[4]的位置
第四次i等于5时
	l[0]和它后面3个数比较,取大值得索引值,内层循环结束后然后把大值放在l[3]的位置
第五次i等于5时
	l[0]和它后面2个数比较,取大值得索引值,内层循环结束后然后把大值放在l[2]的位置
第六次i等于5时
	l[0]和它后面1个数比较,取大值得索引值,内层循环结束后然后把大值放在l[1]的位置

l = [34, 16, 78, 2, 34, 56, 5]
for i in range(len(l) - 1, 0, -1):  # i依次取值为  6 5 4 3 2 1
    maxindex = 0 
    for j in range(1, i+1):         #range(1,7) range(1,6) range(1,5) range(1,4) range(1,3) range(1,2) range(1,1)
        if l[j] > l[maxindex]:
            maxindex = j 
    l[i], l[maxindex] = l[maxindex], l[i]
    
print(l)
 四、二分查找
def binary_search(alist, item):
    """二分查找 非递归方式"""
    start = 0
    end = len(alist) - 1
    while start <= end :
        mid = (start + end) //2
        if alist[mid]==item:
            return '你查找的数:%s ,位于列表中第%s位'%(item,mid+1)
        elif alist[mid] > item:
            end = mid - 1
        elif alist[mid] < item:
            start = mid + 1
    return 'sorry 你查找的数不在列表里'
print(binary_search([1,2,3,34,56,57,78,87],56))

  

 五、快排算法  
#方法一
import time,random
def quickSort(arr):
    less = []
    pivotList = []
    more = []
    if len(arr)<1:
        return arr
    else:
        pivolt = arr[0]
        for i in arr:
            if i<pivolt:
                less.append(i)
            elif i>pivolt:
                more.append(i)
            else:
                pivotList.append(i)
                
        less = quickSort(less)
        more = quickSort(more)
        return less + pivotList + more
    
start = time.time()
res = [ i for i in range(1000)]
random.shuffle(res)
res = quickSort(res)
stop = time.time()
print(stop-start)
快排算法一

 

import random

list1 = [2, 3, 8, 4, 9, 5, 6]
list2 = [5, 6, 10, 17, 11, 2]

def qsort(L):
    if len(L)<2:return L
    pivot_element=random.choice(L)
    small=[i for i in L if i<pivot_element]
    large=[i for i in L if i>pivot_element]
    return qsort(small)+[pivot_element]+qsort(large)

a=qsort(list1+list2)  
print(a) # [2, 3, 4, 5, 6, 8, 9, 10, 11, 17]
快排算法二

 

posted @ 2017-12-07 20:55  _慕  阅读(264)  评论(0编辑  收藏  举报
Title
返回顶部