快速排序的思想:快速排序是冒泡排序的升级版本,他的基本思想是分而治之、迭代;
一、排序步骤:
1、先选一个基准元素(一般是数组的最后一个元素),一这个基准元素为基准对剩下的元素依次进行比较,对于比基准元素小的元素,放到基准元素的左边,比基准元素大的元素放到基准元素的右边,这样经过一轮排序之后基准元素左边的元素比基准元素都要小,基准右边的元素都比基准元素大,再对基准元素左边和右边做同样的比较操作,一直迭代直到最后剩一个元素;
二、模拟图:
三、 示例:
待排序数组:int array = {7,3,4,2,3}
1、选取基准元素:3,比基准元素3小的元素个数n默认为0(即默认所有的元素都比3大)
2、比较7和3的值,很明显7>3,所以n=0不变;
3、比较3和3的值,3=3,n=0不变;
4、比较4和4的值,4>3,n=0不变
5、比较2和3的值,2<3,调换a[n]=a[0]=7和2的值,同时n++=1,此时数组变成{2,3,4,7,3}
6、一轮比较结束此时调换a[n]=a[1]=3和基准元素3的值,此时数组变成{2,3,4,7,3}
7、再进行下一轮排序重复步骤1但是基准排序数组改变了,1个数组变成了2个{2}和{4,7,3},对这2个数组进行迭代排序知道剩一个元素位置;
因为子数组{2}只有一个元素,所以迭代结束,而{4,7,3}在经过一轮排序后变成{3,4,7},此时在对{4,7}进行排序变成{4,7},所以最后的结果{2,3,3,4,7}
四、java实现:
package eureka.server.paixu;
import java.util.Arrays;
public class QuickSort {
public static int splitSort(int arr[], int start, int end){
//比较的基准值,取最后一个值
int base = arr[end];
//比较的开始下表,从start开始
int n = start;
for(int i = start; i < end; i++){
//如果数组值小于基准值
if(arr[i] < base){
exchange(arr,i,n);
n++;
}
}
//循环结束,替换base和
exchange(arr, n, end);
return n;
}
public static int partArr(int[] arr, int start, int end) {
//选取基准元素,这里我们以最后一个位置,作为基准
int base = arr[end];
//记录,比基准元素小的变量,这里我们假设要比较的元素都不小于基准元素,这样通过比较
//就把小于基准元素的数据全部找到,n=start表示的就是默认没有小于基准元素。
int n = start;
//基准元素不参与遍历比较
for (int i = start; i < end; i++) {
if (arr[i] < base) {
exchange(arr, i, n);
n++;
}
}
//遍历完成之后,将基准元素放到应该的位置上
exchange(arr, n, end);
return n;
}
public static void quickSort(int arr[], int start, int end){
if(end <= start)
return;
int n = splitSort(arr, start ,end);
if(n==start){
quickSort(arr,start+1, end);
}else if(n==end){
quickSort(arr,start, end-1);
}else {
quickSort(arr,start, n-1);
quickSort(arr,n+1, end);
}
}
/**
* 交换数组a位置和b位置的值
* @param arr
* @param a
* @param b
*/
public static void exchange(int arr[], int a, int b){
int tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
public static void main(String[] args) {
//int[] arr = {7,3,4,2,3};
int[] arr = {9,8,7,3,4,1,2,3};
quickSort(arr,0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
}