各种排序算法,快速排序算法实例讲解
排序算法3354快速排序
今天介绍快速排序,这也是实践中最常用的排序算法。它既快速又高效。顾名思义,快速排序是最好的排序算法。
想
快速排序的思想是分而治之。
快速排序就是找一个元素(理论上可以选任意一个)作为支点,然后对数组进行分区,使基准左侧元素的值不大于基准值,基准右侧元素的值不小于基准值,这样作为基准的元素在排序后调整到正确的位置。快速递归排序,排序后将其他n-1个元素调整到正确位置。最后,排序后每个元素都在正确的位置,排序完成。所以快速排序的核心算法是划分操作,即如何调整数据的位置和返回数据的最终位置,从而分治递归。
比如这个可能不太好理解。假设要排序的序列是
2 4 9 3 6 7 15首先以2为参照,用i j两个指针从两边扫描,把小于2的元素和大于2的元素分开。首先比较2和5,5大于2,J向左移动。
2 4 9 3 6 715比较2和1,1小于2,所以把1放在2的位置。
2 149 3 6 7 1 5比较2和4,4大于2,所以把4移到后面。
2 149 3 674 5比较2和7,2和6,2和3,2和9,都大于2,满足条件,所以不变。
在第一轮快速排序之后,元素变成如下
[1] 2 [4 9 3 6 7 5]
之后,对2左边的元素进行快速换行,由于只有一个元素,所以快速换行完成。右边快速排列,递归,最后生成最终结果。
密码
int quicksort(向量int v,int left,int right){
如果(左/右){
int key=v[left];
int low=left
int高=右;
当(低高){
while(低高v[高]键){
高-;
}
v[低]=v[高];
while(低高v[低]键){
低;
}
v[高]=v[低];
}
v[低]=键;
快速排序(v,左,低-1);
快速排序(v,低1,右);
}
}
分析
快速排序的时间主要花在除法运算上,需要k-1个关键字比较来划分长度为k的区间.
最坏的情况下,每个划分选择的基准是当前无序区域中关键字最小(或最大)的记录。结果是基准的左子区间为空(或者右子区间为空),除法得到的另一个非空子区间中的记录数只比除法前的无序区少一条。时间复杂度为O(n*n)
在最好的情况下,每个部门采取的基准是当前无序区域的“中值”记录。结果,基准的左右无序子区间长度大致相等。关键字比较总次数:O(nlgn)
虽然快速排序的最差时间为O(n2),但从平均性能来看,它是基于关键字比较的内部排序算法中最快的,因此得名快速排序。其平均时间复杂度为O(nlgn)。
分类
今天介绍快速排序,这也是实践中最常用的排序算法。它既快速又高效。顾名思义,快速排序是最好的排序算法。
想
快速排序的思想是分而治之。
快速排序就是找一个元素(理论上可以选任意一个)作为支点,然后对数组进行分区,使基准左侧元素的值不大于基准值,基准右侧元素的值不小于基准值,这样作为基准的元素在排序后调整到正确的位置。快速递归排序,排序后将其他n-1个元素调整到正确位置。最后,排序后每个元素都在正确的位置,排序完成。所以快速排序的核心算法是划分操作,即如何调整数据的位置和返回数据的最终位置,从而分治递归。
比如这个可能不太好理解。假设要排序的序列是
2 4 9 3 6 7 15首先以2为参照,用i j两个指针从两边扫描,把小于2的元素和大于2的元素分开。首先比较2和5,5大于2,J向左移动。
2 4 9 3 6 715比较2和1,1小于2,所以把1放在2的位置。
2 149 3 6 7 1 5比较2和4,4大于2,所以把4移到后面。
2 149 3 674 5比较2和7,2和6,2和3,2和9,都大于2,满足条件,所以不变。
在第一轮快速排序之后,元素变成如下
[1] 2 [4 9 3 6 7 5]
之后,对2左边的元素进行快速换行,由于只有一个元素,所以快速换行完成。右边快速排列,递归,最后生成最终结果。
密码
int quicksort(向量int v,int left,int right){
如果(左/右){
int key=v[left];
int low=left
int高=右;
当(低高){
while(低高v[高]键){
高-;
}
v[低]=v[高];
while(低高v[低]键){
低;
}
v[高]=v[低];
}
v[低]=键;
快速排序(v,左,低-1);
快速排序(v,低1,右);
}
}
分析
快速排序的时间主要花在除法运算上,需要k-1个关键字比较来划分长度为k的区间.
最坏的情况下,每个划分选择的基准是当前无序区域中关键字最小(或最大)的记录。结果是基准的左子区间为空(或者右子区间为空),除法得到的另一个非空子区间中的记录数只比除法前的无序区少一条。时间复杂度为O(n*n)
在最好的情况下,每个部门采取的基准是当前无序区域的“中值”记录。结果,基准的左右无序子区间长度大致相等。关键字比较总次数:O(nlgn)
虽然快速排序的最差时间为O(n2),但从平均性能来看,它是基于关键字比较的内部排序算法中最快的,因此得名快速排序。其平均时间复杂度为O(nlgn)。
分类
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。