当前位置:   article > 正文

快速排序算法

快速排序算法

一、快速排序

快速排序的最坏情况是O(n^2),比如说顺序 数列的快排。但它的平均期望是O(nlogn),且(nlogn)记号中隐含的常数因子很小,比复杂度稳定等于O(nlogn)的归并排序要小很多,所以,对绝大数顺序性较弱的随机数列而言,快速排序总要优于归并排序。

算法步骤的思想

1.从数列中挑出一个元素,称为“基准”,(pivot)。一般指定为最左边的元素。

2.重新排序数列,所有比基准值小的放在基准前面,所有元素比基准大的放在基准后面。(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区 (partition)操作。

3.递归(recursive)把小于基准值元素的子数列和大于基准元素的子数列排序。

二、动画演示

https://v.qq.com/x/page/w01315ff3b6.html   

三、代码实现 

  1. import java.util.Arrays;
  2. public class Sorts {
  3. //快速排序,递归的思想,将小于pivat的元素放在基准的左侧,将小于pivat的元素放在基准的右侧,然后分别对基准左右的序列进行快排
  4. public void fastSort(int[] arr) {
  5. if (arr == null || arr.length < 2) {
  6. return;
  7. }
  8. //递归
  9. fastSort(arr, 0, arr.length - 1);
  10. }
  11. private void fastSort(int[] arr, int left, int right) {
  12. //递归终止条件
  13. if (left >= right) {
  14. return;
  15. }
  16. //递归操作
  17. //1.确定基准点(指定最左边的元素)
  18. int pivot = arr[left];
  19. //2.定义两个索引i,j。分别指向序列最左边和左右边
  20. int i = left;
  21. int j = right;
  22. //3.再序列中找基准点的位置
  23. while (i < j) {
  24. //从右边找比基准点小的第一个元素
  25. while (i < j && arr[j] > pivot) {
  26. j--;
  27. }
  28. if (i < j) {
  29. //找到之后放到i的位置
  30. arr[i] = arr[j];
  31. i++;
  32. }
  33. // 从左边找比基准点大的第一个元素
  34. while (i < j && arr[i] < pivot) {
  35. i++;
  36. }
  37. if (i < j) {
  38. arr[j] = arr[i];
  39. j--;
  40. }
  41. }
  42. //存放基准点的位置
  43. arr[i]=pivot;
  44. fastSort(arr, left, i-1);
  45. fastSort(arr, i+1, right);
  46. }
  47. //4.对基准左右的序列进行快排
  48. public static void main(String[] args) {
  49. Sorts sorts = new Sorts();
  50. int[] arr = {34, 21, 5, 67, 8, 18, 90, 56};
  51. sorts.fastSort(arr);
  52. System.out.println(Arrays.toString(arr));
  53. }
  54. }

相关博客:

史上最详细图解快速排序_快速排序图解r-CSDN博客 

十大排序之冒泡排序与快速排序(详解)-CSDN博客

  

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号