vlambda博客
学习文章列表

快速排序算法详解及代码实现

算法介绍

快速排序是对冒泡排序的一种改进。

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小;然后再按此方法对这两部分数据分别进行排序;整个排序过程可以递归进行,以此达到整个数据变成有序。


算法描述

  • 从数据列表中挑出一个元素,作为基准。

  • 排序数据,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准后面(相同的数可以到任一边)。在这个过程结束之后,该基准就处于数列的中间位置。

  • 递归地进行上述过程。


排序过程详解

我们通过一个具体的数组,拆分其每一趟的排序过程,来帮助理解排序逻辑。

原始数组为:[1, 5, 6, 3, 2, 10, -1, 9]

其每一趟的排序结果为:

(说明:pivot为排序基准值,arr为排序后的结果)

第一趟:pivot=3,    arr=[1, -1, 2, 3, 6, 10, 5, 9]

第二趟:pivot=-1,   arr=[-1, 1, 2, 3, 6, 10, 5, 9]

第三趟:pivot=1,    arr=[-1, 1, 2, 3, 6, 10, 5, 9]

第四趟:pivot=10,  arr=[-1, 1, 2, 3, 6, 9, 5, 10]

第五趟:pivot=9,    arr=[-1, 1, 2, 3, 6, 5, 9, 10]

第六趟:pivot=6,    arr=[-1, 1, 2, 3, 5, 6, 9, 10]


代码实现

package com.lege.sort;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) { int[] arr = new int[] { 1, 5, 6, 3, 2, 10, -1, 9 }; sort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); }
public static void sort(int[] arr, int start, int end) { int i = start; int j = end; int pivot = arr[(start + end) / 2]; while (i < j) { while (arr[i] < pivot) { i++; } while (arr[j] > pivot) { j--; } if (i >= j) { break; } int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; if (arr[i] == pivot) { j--; } if (arr[j] == pivot) { i++; } }
if (i == j) { i++; j--; } if (start < j) { sort(arr, start, j); } if (end > i) { sort(arr, i, end); }
}}

打印结果为:

[-1, 1, 2, 3, 5, 6, 9, 10]