持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
什么是快速排序
快速排序是一种高级的排序算法,平均时间复杂度可以达到O(nl o g 2 n log_2nlog 2 n),它的主要思想是找一个基准点大于基准点的放在基准点的一端 小于基准点的放在基准点一端 每一端重复这个过程 用递归实现。
总思想:每趟的基准点不变 最后交换基准点
实现快速排序有两个主流的方法:
1.单边循环法:选取最右端作为基准点,有两个变量i j,i用于维护小于基准点元素的边界,也就是每次交换的目标索引, j负责找到比基准点小的元素,一旦找到与i进行交换,最后i在与基准点进行交换 完成一趟排序。
2.双边循环法:选取最左端作为基准点,有两个变量i j,i负责从左向右找到比基准点大的元素, j负责找到比基准点小的元素,一旦找到j与i进行交换,最后基准点再与i j重合点进行交换 一趟排序完成。
算法原理
对数列{5,3,7,2,9,8,1,4}进行升序快速排序。
单边循环法(最右端为基准点):
i=0与j=1进行交换 i=1与j=3进行交换 i=2与j=6进行交换 i=3与r=7进行交换
3 2 1 4 9 8 7 5
i=0与r=2进行交换
1 2 3 4 9 8 7 5
i=1与j=1进行交换 i=2与r=2进行交换
1 2 3 4 9 8 7 5
i=4与r=7进行交换
1 2 3 4 5 8 7 9
i=5与j=5进行交换 i=6与j=6进行交换 i=7与r=7进行交换
1 2 3 4 5 8 7 9
i=5与r=6进行交换
1 2 3 4 5 7 8 9
双边循环法(最左端为基准点):
基准点下标0 基准点值5
i=2与j=7进行交换 i=4与j=6进行交换 i=4与j=4进行交换 l=0与j=4进行交换
1 3 4 2 5 8 9 7
基准点下标0 基准点值1
i=0与j=0进行交换 l=0与j=0进行交换
1 3 4 2 5 8 9 7
基准点下标1 基准点值3
i=2与j=3进行交换 i=2与j=2进行交换 l=1与j=2进行交换
1 2 3 4 5 8 9 7
基准点下标5 基准点值8
i=6与j=7进行交换 i=6与j=6进行交换 l=5与j=6进行交换
1 2 3 4 5 7 8 9