常用的两种nlogn级别的排序——快排,归排

本文介绍了快速排序和归并排序这两种常见的nlogn时间复杂度的排序算法。快速排序是不稳定的排序方法,通过选取标尺并利用双指针进行分区和递归排序。归并排序则是通过分治策略,将序列分成两半,递归排序后再合并,需要额外的辅助数组来完成排序。此外,还讨论了归并排序中如何计算逆序对。
摘要由CSDN通过智能技术生成

1.快排简述:

其实快速排序是我们使用最多的一种排序,因为包含快速?人们的第一直观感觉就是觉得很快速,那么当然他是相当快的一种排序,如果你的评测机快的话勉强能排1000000个数,差不多可以了,但是他是不稳定的排序,什么是不稳定排序?就是比如对下面数进行排序
3 2 2 1 5
不稳定排序就是说对于待排序的数有数值相同的时候,比如a[2] = 2, a[3] = 2但是排序过后不一定他们这两个2还是按照之前未排序前的转态存在。
快排不稳定.png
我们我们以(13表示未排序前的下标和位置)
待排序:13 22 32 41 55
排序后:41 32 22 13 55
快排是很有可能会造成32 和 22他们排序后的顺序不同, 这就是不稳定排序。

2.快排过程:

分三步走:
1.选择一个标尺, 标尺一般有三种选取方法, 选最左端的数, 选最右端的数, 选中间的数, 当然还可以随机选取。
2.运用一个双指针去扫描一遍序列,将比标尺小的排到标尺左边,比标尺大的排在标尺右边。
3.因为2只能将比标尺小的放在左边比标尺大的放在右边但是对于标尺左边的数并不能保证有序,所以还需要递归地去排左区间和右区间。
针对于
3 2 2 1 5
比较常用的选取标尺的方式是选取中间(1 + 5) / 2 = 3选取第三个为标尺
第二部分
扫一遍序列
发现3是大于标尺2的,那么我们就不往左边扫,从右边扫发现1是小于标尺2的
然后交换3和1
1 2 2 3 5

3.快排常用模板:

inline void quickSort(int a[], int l, int r) {
   
	if (l >= r) return ;  //边界条件
	//i为l - 1是因为我们使用的是do while循环,不管怎样循环都会走一次,j也一样 
	int i = l - 1, j = r + 1, x = a[l];  
	while (i < j) {
   
		do i ++;
		while (a[i] < x);
		do j --;
		while (a[j] > x);
		if
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序(Quick Sort)是一种常用排序算法,其空间复杂度为O(nlogn)。 快速排序是一种分治策略的排序算法,它基于一个简单的原理:通过选择一个元素作为基准(通常为数组的第一个或最后一个元素),将数组分成两个子数组,一个子数组的所有元素都小于等于基准,另一个子数组的所有元素都大于等于基准。然后对两个子数组递归地进行快速排序,最后合并得到有序数组。 在快速排序的过程中,需要额外的空间用于存储递归调用时产生的栈帧。具体来说,每次划分数组时,都需要调用一个递归函数来对划分后的两个子数组进行排序。递归函数的调用会导致栈帧的产生,而栈帧的大小取决于递归深度。在最坏情况下,即数组已经有序的情况下,递归的深度为n,因此需要O(n)的额外空间。 而在平均情况下,快速排序的递归深度为logn。这是因为每次划分数组时,都将基准元素放入正确的位置,并保证了左边的子数组元素都小于等于基准,右边的子数组元素都大于等于基准。这种划分方式保证了每次划分的规模都约为原来的一半,从而递归深度为logn。 因此,快速排序的空间复杂度可以看作是递归深度乘以每个栈帧的大小,即O(logn) * O(n) = O(nlogn)。这说明快速排序的空间复杂度在平均情况下为O(nlogn),而在最坏情况下为O(n)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值