• paixu


    排序

    冒泡排序

    • 1.将原始列表中的最大值找出且放置在列表最右侧(将元素两两比较,将数值大的数逐步向后移动)
    • 2.重复执行步骤1

    1573092830557

    #将原始列表中的最大值找出且放置在列表最右侧(将元素两两比较,将数值大的数逐步向后移动)
    def sort(alist):
        for i in range(len(alist)-1):
            if alist[i] > alist[i+1]:
                alist[i],alist[i+1] = alist[i+1],alist[i]
        return alist
    
    def sort(alist):
        for j in range(len(alist)-1):
            #交换
            for i in range(len(alist)-1-j):
                if alist[i] > alist[i+1]:
                    alist[i],alist[i+1] = alist[i+1],alist[i] 
        return alist
    

    选择排序

    • 1.将列表中的最大值一次找出,放置在列表最右侧
    #将列表中的最大值的下标找到
    def sort(alist):
        max_index = 0 #最大值的下标
        for i in range(1,len(alist)):
            if alist[max_index] < alist[i]:
                max_index = i
        print(max_index)
    
    #将列表中的最大值一次找出,放置在列表最右侧
    def sort(alist):
        max_index = 0 #最大值的下标
        for i in range(1,len(alist)):
            if alist[max_index] < alist[i]:
                max_index = i
        alist[max_index],alist[len(alist)-1] = alist[len(alist)-1],alist[max_index]
        
        return alist
    
    def sort(alist):
        for j in range(len(alist),1,-1):
            max_index = 0 #最大值的下标
            for i in range(1,j):  #len(alist)  == > j
                if alist[max_index] < alist[i]:
                    max_index = i
            alist[max_index],alist[j-1] = alist[j-1],alist[max_index]
        
        return alist
    

    插入排序

    1573096022864

    def sort(alist):
        i = 1
        if alist[i] < alist[i-1]:
            alist[i],alist[i-1] = alist[i-1],alist[i]
    
    def sort(alist):
        i = 2
        while i > 0:
            if alist[i] < alist[i-1]:
                alist[i],alist[i-1] = alist[i-1],alist[i]
                i -= 1
    
    def sort(alist):
        for i in range(1,len(alist)):
            while i > 0:
                if alist[i] < alist[i-1]:
                    alist[i],alist[i-1] = alist[i-1],alist[i]
                    i -= 1
                else:
                    break
        return alist
    

    希尔排序

    插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本,该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高。

    1573096611468

    def sort(alist):
        gap = len(alist) // 2
        #将插入排序当做增量为1的希尔排序
        for i range(1,len(alist)):
            while i > 0 :
                if alist[i] < alist[i-1]:
                    alist[i],alist[i-1] = alist[i-1],alist[i]
                    i -= 1
                else:
                    break
    
    
    def sort(alist):
        gap = len(alist) // 2
        #将增量设置成gap
        for i range(gap,len(alist)):
            while i > 0 :
                if alist[i] < alist[i-gap]:		# 
                    alist[i],alist[i-gap] = alist[i-gap],alist[i]
                    i -= gap
                else:
                    break
    
    
    #继续缩小增量
    def sort(alist):
        gap = len(alist) // 2
        while gap >= 1:
            #将增量设置成gap
            for i in range(gap,len(alist)):
                while i > 0 :
                    if alist[i] < alist[i-gap]:
                        alist[i],alist[i-gap] = alist[i-gap],alist[i]
                        i -= gap
                    else:
                        break
            gap //= 2
        return alist
    
    

    归并排序

    • 归并排序采用分而治之的原理:
      • 将一个序列从中间位置分成两个序列;
        • 在将这两个子序列按照第一步继续二分下去;
          • 直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。
            • 如何合并?

            下图中的倒数第三行表示为第一次合并后的数据。其中一组数据为 4 8 , 5 7。该两组数据合并方式为:每一小组数据中指定一个指针,指针指向每小组数据的第一个元素,通过指针的偏移指定数据进行有序排列。排列情况如下:

    1. p1指向4,p2指向5,p1和p2指向的元素4和5进行比较,较小的数据归并到一个新的列表中。经过比较p1指向的4会被添加到新的列表中,则p1向后偏移一位,指向了8,p2不变。

          2.p1和p2指向的元素8,5继续比较,则p2指向的5较小,添加到新列表中,p2向后偏移一位,指向了7。

          3.p1和p2指向的元素8,7继续比较,7添加到新列表中,p2偏移指向NULL,比较结束。

          4.最后剩下的指针指向的数据(包含该指针指向数据后面所有的数据)直接添加到新列表中即可。

    1573098216980

    def merge_sort(alist):
        n = len(alist)
        #结束递归的条件
        if n <= 1:
            return alist
        #中间索引
        mid = n//2
    
        left_li = merge_sort(alist[:mid])
        right_li = merge_sort(alist[mid:])
    
        #指向左右表中第一个元素的指针
        left_pointer,right_pointer = 0,0
        #合并数据对应的列表:该表中存储的为排序后的数据
        result = []
        while left_pointer < len(left_li) and right_pointer < len(right_li):
            #比较最小集合中的元素,将最小元素添加到result列表中
            if left_li[left_pointer] < right_li[right_pointer]:
                result.append(left_li[left_pointer])
                left_pointer += 1
            else:
                result.append(right_li[right_pointer])
                right_pointer += 1
        #当左右表的某一个表的指针偏移到末尾的时候,比较大小结束,将另一张表中的数据(有序)添加到result中
        result += left_li[left_pointer:]
        result += right_li[right_pointer:]
    
        return result
    
    alist = [3,8,5,7,6]
    print(merge_sort(alist))
    
    

    快拍

    def sort(alist,start,end):
        low = start
        high = end
    
        
        #结束递归的条件
        if low > high:
            return
        mid = alist[low]
        
        while low < high:
            while low < high:
                if alist[high] > mid:
                    high -= 1
                else:
                    alist[low] = alist[high]
                    break
            while low < high:
                if alist[low] < mid:
                    low += 1
                else:
                    alist[high] = alist[low]	
                    break
                    
    #         if low == high:
        alist[low] = mid
        
        sort(alist,low+1,end) #将基准右侧的子列表进行递归操作
        sort(alist,start,high-1)
        return alist
    
    
    def sort(alist,start,end):
        low = start
        high = end
        #递归结束的条件
        if low > high:
            return
        #基准:最左侧的数值
        mid = alist[low]
        #low和high的关系只能是小于,当等于的时候就要填充mid了
        while low < high:
            while low < high:
                if alist[high] > mid:
                    high -= 1
                else:
                    alist[low] = alist[high]
                    break
            while low < high:
                if alist[low] < mid:
                    low += 1
                else:
                    alist[high] = alist[low]
                    break
            
            #当low和high重复的时候,将mid填充
            if low == high:
                alist[low] = mid #or alist[high] = mid  
                break
        #执行左侧序列
        sort(alist,start,high-1)
        #执行右侧序列
        sort(alist,low+1,end)
        
        return alist
    
    

    dotnet-cnblog D:pythonpython_code面试排序.md

    排序.md

  • 相关阅读:
    数据库中生成UUID的方式
    db2如果修改主机名之后
    linux修改主机名
    db2动态查看备份进度
    oracle-DG
    linux环境变量和对应文件的生效顺序
    数据泵与传统exp/imp对比
    oracle之ogg部署(RAC到单机)
    oracle之ogg部署(单机到单机)
    达梦 (实时主备+数据守护)测试
  • 原文地址:https://www.cnblogs.com/Doner/p/11811197.html
Copyright © 2020-2023  润新知