关于快速排序,前面数据结构曾经说过一次,写推荐看快速排序有关概念—推荐
关于快速排序,
1.找到一个枢纽元。
2.第二把小于它的放左边,把大于它的放另外一边,自己则放在中间。
3.重复这个过程,再分别对2个左边,右边的序列完成一次快速排序。
怎么找枢纽元?
这个就是这个快速排序的各种变形了,比如书上说了选最后一个元素,其实,根据不同的选择就会有不同的变形。
具体请看这里3种快排
最后,就是无非分析这个算法,是多么多么的好,你只要记住最坏情况为o(n2),而一般情况为o(nlgn)就够了。
这里我说一种,三数中值分割的快速排序。代码如下:
public class quick_sort {
public static void quicksort(int [] a){
quicksort(a,0,a.length-1);
}
private static void quicksort(int [] a,int left,int right){
if(left<=right){
int pivot=median(a,left,right);
int i=left,j=right-1;
for(;;){
while(a[++i]<pivot){}
while(a[--j]>pivot){}
if(i<j) swap(a,i,j);
else
break;
}
quicksort(a,left,i-1);
quicksort(a,i+1,right);
}
}
private static int median(int [] a,int left,int right){
int center=(left+right)/2;
if(a[center]<a[left])
swap(a,left,center);
if(a[right]<a[left])
swap(a,left,right);
if(a[right]<a[center])
swap(a,center,right);
swap(a,center,right-1);
return a[right-1];
}
}
关于快速排序,具体的实现,可以说是各种各样,都可以,但最起码,你必须知道它的思想,它在做什么?如何做?这个策略就决定了你的写法,像上面,你可以在median函数中,完成对这个序列的分割,也可以写在主函数里面,这都是完全由个人所决定的。
想了解更多,推荐大家看上面我给的两个连接,很详细了