快速排序
快速排序(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右边全是大于它的,左边全是小于它的。
会发现这里移动元素是一个非常巧妙的过程
如此递归下去就可以得出结果。