zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序(Quicksort)是对冒泡排序的一种改进。由C.A.R.Hoare在1962年提出。
    基本思想
      通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
     
     1  public int[] quickSort(int a[], int left, int right) {
     2         int L= left;
     3         int R= right; 5         if ( L< R) {   //待排序的元素至少有两个的情况,:L< R
     6             int temp = a[L];  //待排序的第一个元素作为基准元素
     7             while (L!= R) {   //从左右两边交替扫描,直到L= R
     8 
     9                    while (R> L && a[R] >= temp)
    10                     R--;        //从右往左扫描,找到第一个比基准元素小的元素
    11                 a[L] = a[R];  //找到这种元素a[R]后, 与a[L]交换
    12 
    13                 while (L< R && a[L] <= temp)
    14                     L++;         //从左往右扫描,找到第一个比基准元素大的元素
    15                 a[R] = a[L];  //找到这种元素a[L]后,与a[R]交换
    16 
    17             }
    18             a[R] = temp;    //基准元素归位,现在R=L,将基准调到中间
    19 quickSort(a, left, L- 1); //对基准元素左边的元素进行递归排序 20 quickSort(a, R+ 1, right); //对基准元素右边的进行递归排序 21 } 22 return a; 23 }

    绿色部分赋值语句是比较难以理解的.让我们还看一个例子:

    这里有一个8个元素的数组:

    我们来看一看是如何将大于小于temp的元素移动到其两边的,架设第一个while是外循环,里面两个while是内循环。

    Recursion1:

    外循环1:

    L=0, R = 7;temp = a[0] = 4

    L<R   =>  从右到左直接找到比4小的2,R不变 ,arr[0] = 2 :

     

    L<R  =>  从左到右找到比4大的5,L = L + 1 = 1,arr[R] = arr[7] = arr[1] = 5:

    外循环2:

    L<R   =>  从R=7处到左直接找到比4小的3,R = R- 2 = 5 ,arr[L] = arr[1] = arr[R] = arr[5] =3 , so

     

     

    L<R  =>  从左(L =1)到右找到比4大的6,L = L+1=2, 

    外循环3:

     

    如此下去会出现 R=L, 然后temp(基准归位)置中,即可得到 temp右边全是大于它的,左边全是小于它的。

    会发现这里移动元素是一个非常巧妙的过程

    如此递归下去就可以得出结果。

     

     

     

     

  • 相关阅读:
    iscroll 子表左右滚动同时保持页面整体上下滚动
    mac xampp命令行调用mysql
    学习—ReentrantLock
    sychronized和lock的区别
    学习——常见垃圾回收器
    学习——java内存模型
    学习——哈夫曼编码
    数据库—Innodb中的MVVC
    学习-事务-事务特性
    学习——事务-事务隔离级别
  • 原文地址:https://www.cnblogs.com/XT-xutao/p/9996128.html
Copyright © 2011-2022 走看看