快速排序

快速排序(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右边全是大于它的,左边全是小于它的。

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

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

 

 

 

 

posted @ 2018-11-21 16:54  Edwin_Xu  阅读(107)  评论(0编辑  收藏  举报