分治策略----快速排序

快速排序算法是基于分治策略的另一个排序算法。其基本思想是:对输入的子数组a[p:r],按以下三个步骤进行排序。

 (1) 分解(Divide):以a[p]为基准元素将a[p:r]划分成3段a[p:q-1],a[q]和a[q+1:r],使得a[p:q-1]中任何一个元素小于等于a[q],而a[q+1:r]中任何一个元素大于等于a[q]。下标q在划分过程中确定。

(2) 递归求解(Conquer):通过递归调用快速排序算法分别对a[p:q-1]和a[q+1:r]进行排序。

(3) 合并(Merge):由于对a[p:q-1]和a[q+1:r]的排序是就地进行,所以在a[p:q-1]和a[q+1:r]都已排好的序后,不需要执行任何计算,a[p:r]就已排好序。

 

   

 

快速排序的运行时间与划分是否对称有关,其最坏情况发生在划分过程产生的两个区域分别包含n-1个元素和1个元素的时候。T(n) = T(n-1)+0(n) n>1;T(n) = 0(1)   n<=1;

 

 T(n)=O(n2) ;

  最好情况下,每次划分所取的基准都恰好为中值,即每次划分都产生两个大小为n/2的区域。

T(n) = O(1)  n<=1; T(n) = 2T(n/2) + O(n)   n>1

T(n) = O(nlogn)。

 

可证:快排在平均情况下的时间复杂度也是O(nlogn)。

 

采用随机策略的快速排序算法,在快速排序算法的每一步中,当数组还没有被划分时,可以再a[p;r]中随机选出一个元素作为划分基准.

 

### 分治法在快速排序中的应用 #### 快速排序的核心思想 快速排序是一种基于分治策略的经典排序算法。其核心在于通过一次划分操作将待排序列分割成较小和较大的两个子序列,使得左边的元素都不大于右边的任何元素[^1]。 #### 算法的具体步骤 具体来说,在每次划分过程中选取一个基准值(pivot),通常可以选择序列的第一个或者最后一个元素作为基准值。接着调整序列中其他元素的位置,使所有小于等于基准值的元素移动到它的左侧,而所有大于基准值的元素则被放置在其右侧[^4]。 ```python def partition(arr, low, high): pivot = arr[low] i = low + 1 j = high while True: while i <= j and arr[i] <= pivot: i += 1 while i <= j and arr[j] >= pivot: j -= 1 if i > j: break arr[i], arr[j] = arr[j], arr[i] arr[low], arr[j] = arr[j], arr[low] return j ``` 当完成上述过程之后,就得到了一个新的索引`mid`,它指向的就是当前选定的基准值所在的新位置;此时可以认为已经完成了针对这个特定基准的一次有效划分。 #### 对子序列递归处理 接下来就是对左右两侧形成的新的子序列再次执行相同的操作——即选择新基准并重新排列剩余项直至不能再进一步细分为止。最终得到的结果就是一个完全有序化的列表[^5]。 ```python def quicksort(arr, low, high): if low < high: mid = partition(arr, low, high) quicksort(arr, low, mid - 1) quicksort(arr, mid + 1, high) ``` 值得注意的是,对于非常短的小规模输入集(比如长度不超过20的情况),采用更简单的插入排序可能会更加高效[^2]。因此实际编程实践中有时会在递归调用到达一定深度时切换至更为适合小样本量的方法来优化性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值