排序算法总结--快速排序

前面说的冒泡排序是一种交换排序。交换排序还有一种算法,就是快速排序算法。

快速排序的核心思想是分而治之。意思就是选出一个基准(可以是第一个元素,也可以是最后一个。为了方便我们选取第一个),将小于这个基准的全部元素都放在这个基准的左边,大于这个基准的全部元素都放在基准的右边。然后分别对左右两个数组在进行同样的操作。这里我们就可以用到递归。也就是说我们每次进行上述操作后,都可以得到一个相对有序的数组。通过不断缩小范围,就会得到一个个小的有序数组。然后这个些数组组合起来就可以得到一个完整的有序数组。

直接撸代码(代码实现多种多样)

//分治的思想,以数组首个元素为基准元素,小于基准的放到左边,大于基准的放在右边,然后将基准数归位
void quicksort(int a[],int start, int end) 
{
    int i, j, t, base;
    if (start>= end)
    	return;
    base= a[start]; //base中存的就是基准数
    i = start;
    j = end;
    while (i != j) 
    { 
    	while (a[j] >= base&& i < j)
	    	j--;
    	while (a[i] <= base&& i < j)//再找左边的
    		i++;
    	if (i < j)//交换两个数在数组中的位置
    	{
    		t = a[i];
    		a[i] = a[j];
        	a[j] = t;
    	}
    }
    //最终将基准数归位
    a[start] = a[i];
    a[i] = temp;
    quicksort(a,start, i - 1);//继续处理左边的,这里是一个递归的过程
    quicksort(a,i + 1, end);//继续处理右边的 ,这里是一个递归的过程
    return;
}

复杂度分析

时间复杂度并不好分析,因为快速排序的时间复杂度和选取的元素有关。当然也和数组本身元素的次序有关。平均来说,时间复杂度是O(nlogn)。

空间复杂度:算法本身只是用到了一个临时变量,可以看做不需要额为的空间。但是用到了递归,所以有栈的开销。空间复杂度为O(nlogn)。

适用场景分析:

可以看出,快速排序的时间复杂度是比较低的。所以即使数据量较大,快速排序也能hold住。但是要注意,如果本身数组已经是基本有序的,而且是倒序的,快速排序就退化成冒泡排序了,时间复杂度就变成O(n^2)了。所以当适合数据量大,待排序数组乱序程度高的时候,用快速排序是比较合适的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值