• Title


    一、冒泡排序

    我们来看下面这个程序:
      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]
    快排算法二
  • 相关阅读:
    C# 使用IEnumerable,yield 返回结果,同时使用foreach时,在循环内修改变量的值无效(二)
    C# 使用IEnumerable,yield 返回结果,同时使用foreach时,在循环内修改变量的值无效(一)
    NPOI Excel 单元格背景颜色对照表
    Go语言中的字符和字符串
    ueditor上传图片跨域问题解决
    OAuth在WebApi中的使用,前后台分离的调用方式
    Spark集群高可用HA配置
    安装配置Spark集群
    .net学习
    修改MvcPager分页控件以适用Bootstrap 效果(含英文版,可下载)
  • 原文地址:https://www.cnblogs.com/guotianbao/p/8000537.html
Copyright © 2020-2023  润新知