java实现快速排序
题目
快速排序是冒泡排序的一种改进。其基本思想是: 通过一次行程排序将排序数据拆分为单独的两部分,其中一部分的所有数据都小于另一部分的所有数据,然后对这两部分的数据分别按照快速排序的方法进行排序,整个排序过程可以递归,实现将整个数据分成有序的序列。
基本思想
详细思路
首先,一般我们设定pivot为最左边的元素
设定两个循环指针,一个为数组左边,一个数组最右边
- 循环找比标准数大的数和比标准数小的数 此时用左右两个指针来判断
- 在大循环里面我们先从右边循环开始,如果右边的数arr[r]≥pivot,则右指针向前移动。直到不符合条件为止,即出现右边的数字比pivot小,退出循环。
- 将arr[l] = arr[r];
- 右边的数替换为左边以后,然后开始操作左指针,当左边arr[l] <= pivot时,左指针一直向后移动,直到不符合条件为止,即出现左边的数比pivot大,退出循环。
- arr[r] = arr[l];
- 一直循环操作上述2-5步骤,直到左指针与右指针重合,退出循环
- 此时重合之处,就是pivot所在位置。arr[l] =pivot;
- 然后分别向左向右再次递归,直到变成有序数组。注意向左递归时,左变量不变,右变量变为重合处。右递规时,右边量不变,左变量变为重合处+1.
第一遍思路图
代码
public class QuickSortDemo1 {
public static void main(String[] args) {
int[] arr = {-9,78,0,23,-567,70, -1,900, 4561};
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
if(left < right) {
//把数组中的第0个数字作为标准数
int pivot = arr[left];
//需要记录的排序坐标
int l = left;
int r = right;
//循环找比标准数大的数和比标准数小的数
while (l < r) {
//右边的数字比标准数更大
while (l<r && arr[r] >= pivot) {
r--;//下标前移
}
//将右边的数字替换左边的数字
arr[l] = arr[r];
//左边的数字比标准数更小
while (l<r && arr[l] <= pivot) {
l++;//下标前移
}
//将右边的数字替换左边的数字
arr[r] = arr[l];
}
//把标准数赋予下标相等的地方
if(l >= r){
arr[l] =pivot;
}
//向左向右递归
quickSort(arr,left,l);
quickSort(arr,l+1,right);
}
}
}