什么是快速排序?
原理: 首先找一个基准值,在本次测试中我选取的是左下标。然后派两哨兵分别从左侧和右侧开始检测,左哨兵left向右巡逻,寻找一个比基准值大的元素然后停下,右哨兵向左开始巡逻,寻找一个比基准值小的元素然后停下,最后将两哨兵检测到的元素值进行换位,结束一次循环。(当然前提条件是left<=right)当左右哨兵重合时,把基准值与哨兵所在位置的元素值相交换,结束本轮巡逻!此时,哨兵左边的值都小于原先的基准值,哨兵右边的值都大于基准值,这个时候,将整个数组分成两部分,左半部分和右半部分,分别利用递归思想,完成排序!
翻译成代码就是:
package p2;
import java.util.*;
public class TestArrays{
public static void main(String []args){
int []a = {11,10,9,8,7,6,5,4,3,2,1};
System.out.println("定义的数组为:" + Arrays.toString(a));
sort(a,0,a.length-1);
System.out.println("排序后的新数组为:" + Arrays.toString(a));
}
public static void sort(int []a,int left,int right){
if(left > right){
return;
}
int i = left,j = right;
//取left为基准点
int temp = left;
while(i < j){
//右哨兵往左找比基准点小的值
while(a[j] >= a[temp] && i < j){
j--;
}
//左哨兵往右找比基准点大的值
while(a[i] <= a[temp] && i < j){
i++;
}
if(i < j){
swap(a,i,j);
}
}
//将i,j重合点与基准点换位
swap(a,i,temp);
//递归调用左数组
sort(a,left,i-1);
//递归调用右数组
sort(a,i+1,right);
}
//数组元素换位
public static void swap(int []arr,int i,int j){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
运行效果如图

现在让我们看看,本次排序调用了几次sort函数
pulic class TestArrays{
static int k = 0; // 定义一个计数器k
public static void main(String []args){
//代码和上面的一样
System.out.println("调用了" + k + "次");
}
public static void sort(int []a,int left,int right){
k++; //每调用一次sort函数 k++
//代码和上面的一样
}
}
来看看打印结果

从这里可以看出,调用了23次,那么怎么来的呢?
首先 main函数调用了一次
然后 排序调用了11次
最后 当left > right 开始依次返回上级调用处
同样的 也返回了11次
可能总结的还不是太到位! 我只是个初学者 慢慢来吧~~~~~~ 嘿嘿~~
458

被折叠的 条评论
为什么被折叠?



