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

Posted 乐哥讲Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序算法详解及代码实现相关的知识,希望对你有一定的参考价值。

算法介绍

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

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


算法描述

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

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

  • 递归地进行上述过程。


排序过程详解

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

原始数组为:[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]


以上是关于快速排序算法详解及代码实现的主要内容,如果未能解决你的问题,请参考以下文章

插入排序算法详解及代码实现

交换排序(冒泡排序快速排序的算法思想及代码实现)

8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)

8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)

快速排序-递归实现

算法笔记 排序算法完整介绍及C++代码实现 HERODING的算法之路