##java快速排序
快速排序(挖坑and分治)
采用分治法;
- 1.找到一个基准值,即比对的标杆,一般以数组的第一个元素开始
- 2.数组从前到后,从后到前,以基准值为比较对象,把大于基准值的数放基准值的右侧,把小于基准值的数放它的左侧,达到分两份的效果
- 3.不断重复2,即递归,直到区间里为一个数的时候
示例:
0—1---2—3---4—5---6
2—3---9—2---1—4---5
第一次以a[0] =2作为基准值,把a[0]处挖坑,i=0,j=a.length-1,分别为从前向后,从后向前的指针;
从后向前,a[6]>2,不动,a[5]>2,不动,a[4]<2,将a[4]放入坑中,a[4]处挖坑;
0—1---2—3---4—5---6
1—3---9—2---1—4---5
第二次,基准值仍为2,此时从前向后比对,a[0]<2不动继续,a[1]>2,将a[1]放到刚才挖的坑处,即a[4]=a[1],再在a[1]处挖坑
0—1---2—3---4—5---6
1—3—9---2—3---4—5
第三次,基准值仍为2,此时从后向前比对,a[3]=2,将a[3]放入坑中,即a[1]=a[3],等于标准值的时候,两个方向指针要选中处理一个方向,此时在a[3]处挖坑
0—1---2—3---4—5---6
1—2---9—2—3---4—5
第四次,基准值仍为2,此时从前向后比对,a[2]>2,将a[2]放入坑中,即a[3]=a[2],在a[2]处挖坑
0—1---2—3---4—5---6
1—2---2—9---3—4---5
第三次,基准值仍为2,此时的前后指针指向同一个位置 i=j,把基准值放入坑中
0—1---2—3---4—5---6
1—2---2—9---3—4---5
可以看出以a[2]为基准,左右分割为两部分,左边比2小,右边比2大,
然后分两部分递归,分别从01,36;
代码
public static void quickSort(int[] data, int l, int r) {
if (l >= r) {
return;
}
int low = l;
int high = r;
int key = data[low];
while (low < high) {
for (; ; high--) {
if (low >= high) {
break;
}
if (data[high] < key) {
data[low] = data[high];
break;
}
}
for (; ; low++) {
if (low >= high) {
break;
}
if (data[low] > key) {
data[high] = data[low];
break;
}
}
}
if (low == high) {
data[low] = key;
}
quickSort(data, l, low - 1);
quickSort(data, high + 1, r);
}
/* 主函数*/
public static void main(String[] args) {
int[] data = {1, 11, 9, 9, 9, 2, 3, 2, 3, 1, 4, 2, 2, 2};
quickSort(data, 0, data.length - 1);
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ,");
}
}
小结
-
1.写函数,第一步进来,一定要先判断参数,数组的话:
data==null | data.length> 0 、 l < r -
2.递归的时候,要在循环之外,且要有停止递归的条件,如这里的 l < r
1289

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



