美文网首页
手把手教媳妇-复习快速排序算法

手把手教媳妇-复习快速排序算法

作者: 牛空空 | 来源:发表于2020-07-01 10:54 被阅读0次

快速排序算法的思路分两部分:
1:在一个线性表中,找到一个基准数据用tmp表示,然后将比tmp大的数据全部放在它的右边,比tmp小的数据放在 它的左边,其实就是快速找出tmp在线性表中正确的下标位置:。
2:将线性表以tmp的下标 分为左右两部分,再分别找出左右两部分的第一个位置的元素的正确的下标,重复上面的分而治之的思路,最终线性表所有元素都找到其正确的位置,那么也就实现了排序

package ds

import "log"

//将线性表s中,i下标的值s[i]按照从从小到大的顺序放到正确的位置
//寻找s[i]在线性表s中按照一定顺序(由小到大)所对应的正确的位置,并返回排序后新的基准下标值
//r表示线性表的最大下标的分界线
func ajustLinear(s []int, i, r int) int {

    //用tmp代表s[i]的值
    tmp := s[i]

    for i < r {
        //从线性表右边向左寻找比tmp小的数据,存放到位置i后,基准点 i++
        for i < r && s[r] > tmp {
            r--
        }
        if i < r {
            s[i] = s[r]
            i++
        }
        //从线性表左边向右边寻找比tmp大的数据,存放到r位置,r--
        for i < r && s[i] < tmp {
            i++
        }
        if i < r {
            s[r] = s[i]
            r--
        }

    }
    //当i向右移动,r向左移动满足 i==r时候,tmp基准值在s的正确下标就是i,将tmp赋值给s[i],并返回新的基准点i

    s[i] = tmp

    log.Printf("排序后的线性表:%v",s)
    return i

}

//分治算法实现快速排序,
func QuickSort(s []int,i,r int)  {

    if i<r {
        //首次找到基准数据的正确位置后
        t := ajustLinear(s, i, r)
        //将线性表分为左右两半,继续递归查找基准数据的正确位置
        QuickSort(s,i,t-1)
        QuickSort(s,t+1,r)
    }

}

以下是测试结果:


微信图片_20200701105057.png

ps:类似这种分治的算法也可以用在二叉树的遍历上,重在干净整洁一目了然的演示算法,不严谨的地方暂时忽略

相关文章

网友评论

      本文标题:手把手教媳妇-复习快速排序算法

      本文链接:https://www.haomeiwen.com/subject/tokcqktx.html