快速排序和冒泡排序一样也是交换排序的一种,快速排序是改进了冒泡排序,属于高级排序,时间复杂度也大大降低。
快速排序原理 首先在一组无规则数组中 例:{3,6,7,9,5,1,4,8}
我们以arr[left]为mid中间点值(当然这里可以随意指定) left为比3小的数,right为3大的数,3为分割线(从小到大排序),
判断arr[right]>=mid的话,往前移动,一直移动到1的位置,因为arr[right] =1 >=mid 不成立,然后停止移动
然后在移动左指向,判断 arr[left]<=mid ,到了arr[left] = 6 的位置,停下来,交换彼此的位置
(此处停下,然后交换位置)
然后再次移动,一直移动到 left == right时
此时然中值和指向的值交换位置 即
然后递归上述操作,左递归,右递归即可排序完成 ,
下面代码演示:
public class QuickSort {
public static void main(String[] args) {
int[] arr = {6,3,7,9,5,1,4,8};
sort(arr.length-1,0,arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int right,int left,int[] arr) {
if(left>right) {
return;
}
int l = left; //left为0
int r = right;//right为数组长度-1 最后一个下标
int mid = arr[left];//中值 随意定的
while(l!=r) {
//先让右指向移动
while(arr[r]>=mid&&l<r) {
r--;
}
//再让左指向移动
while(arr[l]<=mid&&l<r) {
l++;
}
//都停止移动时,交换双方位置
int temp = arr[r];
arr[r] = arr[l];
arr[l] = temp;
}
//当都指向同一下标时,交换与中值的位置
arr[left] = arr[l];
arr[l] = mid;
//重复上面操作
//左递归
sort(l-1, left, arr);
//右递归
sort(right, l+1, arr);
}
}