基本介绍
快速排序是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以达到整个数据变成有序序列。
案例分析
要求将数组[-9,78,0,23,-567,70]从小到大进行排序。
假设我们取数组中间一个数为参照,如以0为参照,步骤如下:
初始化左右指针0,5,选择(0+5)/2=2的下标值为0为参照,左边放比0小的,右边放比0大的,黑色指针此时-9和0比较,-9比0小,继续遍历,78比0大,暂停左边遍历,左指针指向78,此时右边指针开始遍历,70比0大,移动右指针,-567比0小,暂停右边遍历,进行交互数据,此时左指针指向下标为1的-567,右指针指向78,左右指针继续进行和0进行比较,0不比0小,暂停左遍历;右指针指向23,23比0大,继续遍历,右指针指向0,此时左右指针相等,一轮遍历结束。
一轮遍历进行分割数据,分割后为 -9,-567,0,23,78,70;然后在对0左边和右边的按照这种方式遍历;
代码实现
快速排序的代码是实现:
/**
* 快速排序
* @param arr 数组
* @param l 左指针初始值
* @param r 右指针初始值
*/
public static void quickSort(int[] arr,int l,int r){
//中间值
int point = arr[(l+r)/2];
//左指针
int left = l;
//右指针
int right = r;
//临时值
int temp;
while (left < right) {
//如果左边出现比中间值大,则退出此循环
while (arr[left] < point){
left++;
}
//如果右边出现比中间值小,则退出此循环
while (arr[right] > point) {
right--;
}
//如果left的值比right的值要大,则说明此时的值已是按照左边的值比中间值小,右边的值比中间值大
//不需要进行后面的交换
if (left >= right) {
break;
}
//交换数据
temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
//如果交换后,发现此时right所指向的值的和中间值相同,left要进行+1操作,避免数组中有重复数据进入死循环
if (arr[right] == point) {
left++;
}
if (arr[left] == point) {
right--;
}
}
//交换后继续进行遍历,如果当left和right值相等时,则left++;right--;
if (left == right){
left++;
right--;
}
if (l < right) {
quickSort(arr,l,right);
}
if (r > left) {
quickSort(arr,left,r);
}
}
测试:
public static void main(String[] args) {
int[] arr = new int[]{-9,78,0,23,-567,70};
quickSort(arr,0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
测试结果: