何为快速算法:它是冒泡排序的改进~
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
算法的整个处理过程如下:
核心思想:基准数不断不断归位的过程(右边大于基准数,左边小于基准数):
当基准数为左边第一个数时,(从右边向左开始扫描,当扫描到小于基准数的时候,暂停扫描,此时数组下标为j
轮到左边往右边扫描,当扫描到大于基准数的时候,暂停扫描,此时数组下标为i,交换i与j下标的数值),继续“()”的步骤。
什么时候截止呢?当i=j时,将基准数base与i所指的数交换,然后不断的迭代这个过程。
当基准数为左边第一个数时,(从右边向左开始扫描,当扫描到小于基准数的时候,暂停扫描,此时数组下标为j
轮到左边往右边扫描,当扫描到大于基准数的时候,暂停扫描,此时数组下标为i,交换i与j下标的数值),继续“()”的步骤。
什么时候截止呢?当i=j时,将基准数base与i所指的数交换,然后不断的迭代这个过程。
算法实现如下:
- public static void quickSort(int [] a, int left, int right) {
- int i, j, t, base;
- if (left > right)
- return;
- base = a[left]; // base中存的就是基准数
- i = left; // 设置左右两个参数
- j = right;
- while (i != j) {
- //要先从右边开始找
- while (a[j] >= base && i < j)
- j--;
- // 再找左边的
- while (a[i] <= base && i < j)
- i++;
- // 交换两个数在数组中的位置
- if (i < j) {
- t = a[i];
- a[i] = a[j];
- a[j] = t;
- }
- }
- // 最终将基准数归位
- a[left] = a[i];
- a[i] = base;
- quickSort(a, left, i - 1);// 继续处理左边的,这里是一个递归的过程
- quickSort(a, i + 1, right);// 继续处理右边的 ,这里是一个递归的过程
- }