快速排序
快速排序介绍
如果使用插入排序将数组{4,2,6,8,3,5,1,9,7,0}按从小到大排序,在插入排序0的时候,需要依次判断前移找到最前面的位置,这使得排序判断成本增加。
快速排序则是对这种情况的一种优化排序,是冒泡排序的一种改进。取一个中间标准点,将大于这个标准点的值和小于标准点的值进行分组并放置在这个标准点的左右两侧,然后按照顺序递归排序左右两组的数据,最后形成有序数组。
代码解析(直接选取的中间点为标准点):
public static void main(String[] args) {
int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
sort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr, int left, int right) {
int l = left;
int r = right;
int pivot = (right + left) / 2;//中间位置
while (l < r) {
while (arr[l] < arr[pivot]) {//找到比标准点大的数字(最差情况找到标准点退出)
l += 1;
}
while (arr[r] > arr[pivot]) {//同理
r -= 1;
}
if (l >= r) {
break;
}
//交换左右两个点数据
arr[l] = arr[l] + arr[r];
arr[r] = arr[l] - arr[r];
arr[l] = arr[l] - arr[r];
if (arr[l] == arr[pivot]) //如果找到相等值,索引r需要左移
r -= 1;
if (arr[r] == arr[pivot])//同理
l += 1;
}
if (l == r) {//如果索引相同,则需要错开索引,避免栈溢出
l += 1;
r -= 1;
}
if (r > left)//左递归
sort(arr, left, r);
if (l < right) //右递归
sort(arr, l, right);
}