今天是释然发题解的第十四天,以后每一天都会和大家分享学习路上的心得,希望和大家一起进步,一起享受coding的乐趣。
本文约1400字,预计阅读4分钟
昨天我们学习了分治,忘记的小伙伴们可以看一下哦:
[初识分治(https://blog.csdn.net/MATLAB2020ab/article/details/105600173)
今天我们来聊一聊快速排序,明天和大家分享分治的相关例题:
定义:来源菜鸟教程
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。
我的理解
首先随机选择一个数(通常是第一个数),定义两个指针一个是left一个是right,left从第一个数开始往后找,right是从最后一个数开始往前找,当碰到比第一个数小的时候,让a【j】和 a【1】互换,换完以后让i右移,如果a【i】<a【j】就再次交换,知道a【1】左边都比它小,右边都比它大,再递归地调用左侧和右侧,实现快速排序
上面的这个是我的理解,用到的还是分治的思想,因此时间复杂度为nlogn,
空间复杂度为logn,属于非稳定排序,原地排序
快速排序
分治算法里面重要的一个应用就是快速排序:
又分为:找到中介+递归(递归的思想)
//首先我们写一个交换函数,因为要找到中介,所以中介需要和很多数交换位置
void swap(int *x, int *y)
{
int tem;
tem = *x;
*x = *y;
*y = tem;
}
接下来是快速排序的主体:从a【left】开始到a【right】结束
void quicksort(int a[], int left, int right)
{
if (left >= right)
return;
int t=a[left];
int i = left, j = right;
while (i != j)
{
while (j > i && a[j] > t)
j--;
swap(a[j], t);
while (j > i && a[i] < t)
i++;
swap(a[i], t);
}
quicksort(a,left,i-1);
quicksort(a,i+1,right);
}
总的来说应该是比较好理解的,就是先一个中间量,然后递归左边& 右边
好了,今天的有关快速排序的知识就到这里
释然每天发布一点自己学习的知识,希望2年后我们也能在ACM的赛场上见面,一起去追寻自己的程序猿之路吧!
后期也会和大家一起分享学习心得和学习经验呢,明天我们不见不散哦!
下期预告:
分治的相关例题
如果大家有什么建议或者要求请后台留言,释然也想和大家一起进步呀!
联系方式:shirandexiaowo@foxmail.com