排序——快速排序

一、基本介绍

​ 冒泡排序是对冒泡排序的一种改进,其基本思想是:通过一趟排序将待排序数据分割成独立的两个部分,其中一部分比另一部分的最小数据还要小,然后在依照此方法对两部分数据分别使用快速排序,最终形成有序序列。

二、排序过程

对数组[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);
    }
}
posted @ 2020-02-19 15:15  xhanglog  阅读(148)  评论(0编辑  收藏  举报