递归思想:
1.将数组划分成两个子数组
2.两个子数组
递归调用快排函数继续向下划分两个子数组。。。。
划分子数组的原则:
选取一个基准值A(一般选数组的第一个或最后一个元素),比A小的放左边,比A大的放右边。
1
//1.划分数组方法
2
//arr:数组,start:数组起始索引,end:数组结束索引
3
//base:基准值(默认为数组第一一个值)
4
public void partition(int[] arr,int start,int end){
5
if (start < end) {
6
int base = arr[start];//获取基准值
7
int i = start;//左指针
8
int j = end + 1;//右指针
9
while (true) {
10
while (i < end && data[++i] <= base);//左指针往右不断地移,遇到比base大的就跳出循环
11
while (j > start && data[--j] >= base);//右指针往左不断地移,遇到比base小的就跳出循环
12
if (i < j) {
13
swap(arr, i, j);//跳出循环后还没结束,交换左右指针的值
14
} else {
15
break;//结束了,直接跳出大循环
16
}
17
}
18
swap(arr, start, j);//交换基准值(start索引)和j指针的元素位置(此时j所指的数变成类比base小)
19
partition(arr, start, j - 1);//base值左边进行递归划分数组
20
partition(arr, j + 1, end);//base值右边进行递归划分数组
21
}
22
}
23
24
25
//2.排序方法
26
public void quickSort(int[] arr){
27
partition(arr,0,arr.length-1);
28
}