• 常见的算法排序之交换类排序


    1.快速排序

      基本实现方法:经过一次排序算法之后,先简单的将数据分为两部分,取一个中间数(一般为第一个元素)以这个中间数为中心,左边的数为比这个数小的数,右边的数为比这个数大的数。

             之后再进行递归算法,分别处理已经分好的以中间数为分界的左右两堆数据。直到找到我们想要的排好序的数组。

      基本方法步骤:1.先确定一个对比数为中间数,(一般为第一个元素)

             2.取两个变量i、j,i为下标的数字为这个数组的第一个元素,j为下标的数字为这个数组的最后一个元素。

             3.首先从后向前进行比较,即最后一个元素与中间数进行比较,如果最后一个元素的值大于第一个元素,j- -,继续进行比较,如果j为下标的元素的值小于第一个元素,将j为下标

              元素的值赋给i为下标的元素。结束这一次比较。

             4.开始从前往后进行比较,如果第一个数的值小于中间值,i++,接着进行比较,如果i为下标的元素的值大于中间数,将这个数字的值赋给j为下标的元素。结束这一次比较。

             5.重复3和4步骤,直到  i>j。

      原理:让指定的元素归位,所谓归位,就是放到它应该放到的位置,(左边的元素比它小,右边的元素比它大),然后对每个元素归为,就完成了排序。

      代码如下:

        

    #归位函数
    def partition(velue,l,r)                #左右分别指向两端元素
        mid=velue[l]:                         #把左边第一个元素赋值给mid,此时l指向空
        while l < r :                           #左右两个指针不重合就继续 
            while l <r and vulue[r] >= mid :#r指向的元素大于mid,则不交换
               r-=1        #r向左移动一位
            velue[l]=velue[r]#如果r指向的元素小于mid,就放在左边现在为空的位置
            while l <r and velue[r]<=mid: #如果l指向的元素小于mid,则不叫换
               l+=1        #l向右移动一位
            velue[r]=velue[l]   #如果 l 指向的元素大于mid,则交换到右边 
        velue[l]=mid              #最后把最开始拿出来的值放到左右两边重合的位置 
        return l                        #最后返回这个位置
    
    #写好归位函数后就可以递归调用这个函数,实现排序
    
    def q_sort(velue,l,r):
        if l<r:
            mid_velue=partition(velue,l,r)    #找到指定元素的位置
            q_sort(velue,l,mid_velue-1)         #对左边元素排序
            q_sortvelue,mid_velue+1,r)        #对右边元素排序
        return velue
    

      

    冒泡排序

    1.原理:重复的走访过要排序的数列,一次比较两个元素,如果它们的排序错误,就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该序列已经

        排序完成。(越小的元素会慢慢“浮”到数列顶端)

    2.步骤:

       1.比较相邻的元素,如果第一个比第二个大,就交换它们两。

       2.对每一对相邻的元素做同样的工作,从开始第一对到结尾最后一对。这个步骤结束后,最后的元素会是最大的数。

       3.针对所有元素重复以上步骤,除了最后一个。

       4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    3.代码 

    def bubble_sort(li):
        length=len(li)    #第一级遍历
        for index in range (length):    #第二级遍历
            for j in range(1,length-index):    #j为列表下标
                if li[j-1]>li[j]:    #交换两者数据,这里没用temp,是因为python特性元素
                    li[j-1],li[j]=li[j],li[j-1]
        return li
    

      优化后的代码,添加一个标志,在排序完成时,停止排序。

    def bubble_sort(li):
        length=len(li)
            for index in range(length):    #j为列表下标
                flag=ture    #标志位
                for j in range (1,length-index):
                    if li[j-1]>li[j]:
                        li[j-1],li[j]=li[j],li[j-1]
                        flag=false
                if flag:        #没发生交换
                    return li
                return li
    

      

  • 相关阅读:
    MySQL之存储引擎
    MySQL之基础功能
    MySQL之正则表达式
    MySQL之数据类型
    MySQL之多表查询
    MySQL之单表查询
    linux命令useradd添加用户详解
    MySQL之数据操作
    MySQL之表操作
    MySQL之库操作
  • 原文地址:https://www.cnblogs.com/jacky912/p/10677634.html
Copyright © 2020-2023  润新知