一、基本介绍
冒泡排序是对冒泡排序的一种改进,其基本思想是:通过一趟排序将待排序数据分割成独立的两个部分,其中一部分比另一部分的最小数据还要小,然后在依照此方法对两部分数据分别使用快速排序,最终形成有序序列。
二、排序过程
对数组[2 , 10 , 33 , 6 , 21 , 3 , 18] 从小到大排序过程如下:
1. 首先定义一个左边的指针 low 和一个右边的指针 high 记录位置,以及一个中间参考值 mid ,初始时设置 mid = ( mid + high ) / 2 。
2. 左指针指向的值与中间参考值比较,值小于中间值,low 后移加一;右指针指向的值与中间参考值比较,值大于中间值,low 前移减一。
3. 当左指针指向的值大于中间值,右指针指向的值小于中间值时,交换两个位置的值,然后左指针后移加一,右指针前移减一。
4. 当左指针大于右指针时,退出比较,否则重复第二步。
第一次递归过程图如下:
后续依次对左边部分和右边部分分别进行快速排序,实现数组排序。
三、代码实现
参考值的取值可以自己定,这里代码实现取的参考值是中间的那一个数据。
public static void quickSort(int[] arr, int left, int right) {
if (arr == null || arr.length < 2) {//数组为空或者长度为1直接返回
return;
}
int low = left;//定义左指针
int high = right;//定义右指针
int pivot = arr[(left + right) / 2];//定义参考变量值
int temp = 0;
while (low < high) {//当左指针小于右指针时进行遍历排序
while (arr[low] < pivot) {//从左边依次循环找出大于参考值的索引
low++;//指针后移
}
while (arr[high] > pivot) {//从右边依次循环找出小于参考值的索引
high--;//指针前移
}
if (low >= high) {//如果左指针大于大于右指针则退出循环
break;
}
//交换值
temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
if (arr[low] == pivot) {//当交换后,左指针指向的值等于参考值,右指针前移
high--;
}
if (arr[high] == pivot) {//当交换后,左指针指向的值等于参考值,左指针前移
low++;
}
}
if(low == high){//左右指针相等时,左指针后移,右指针前移,防止栈溢出
low++;
high--;
}
if (left < high) {//左递归,对左边部分进行排序
quickSort(arr, left, high);
}
if (right > low) {//右递归,对右边部分进行排序
quickSort(arr, low, right);
}
}