排序算法-快速排序
参考博文:http://www.cnblogs.com/MOBIN/p/4681369.html
快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现
思想:
1.在待排序的元素中任取一个元素作为基准(通常选第一个元素,但最好的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素
2.将待排序的元素进行分区,对基准元素大的元素放到它的右边,比其小的放在它的左边
3.对左右两个分区重复以上步骤直到所有元素都是有序的
所以可以把快速排序联想成东拆西补或西拆东补,一边拆一边补,直到所有元素达到有序状态,
左边被拆了,就要遍历右边的元素去补,右边被拆了,就遍历左边的元素去补
实现代码:
1 public class QuickSort { 2 3 public static void main(String[] args) { 4 int[] arr = {5,7,1,8,4}; 5 int _left = 0; 6 int _right = arr.length-1; 7 8 System.out.print("排序前:" ); 9 for(int num:arr) { 10 System.out.print(num); 11 } 12 13 quickSort(arr,_left,_right); 14 System.out.print("----排序后:" ); 15 for(int num:arr) { 16 System.out.print(num); 17 } 18 } 19 20 private static void quickSort(int[] arr, int _left, int _right) { 21 int left = _left; 22 int right = _right; 23 int base = 0; 24 if(left < right) { 25 base = arr[left]; //我们将base元素单独拿出,这样base元素的位置就出现了一个坑 26 while(left != right) { 27 while(left < right && arr[right] >= base) //从右往左找 小于 base 的元素,将其填入base左边的坑中 28 right--; //这个 while的目的,就是不停地移动right指针,直到某个元素小于base, 29 arr[left] = arr[right]; //小于base的元素是不应该出在右边的,所以我们把它放到左边的坑中,这样在右边又空出来了一个坑 30 31 while(left < right && arr[left] <= base) //从左往右找 大于 base 的元素,将其填入base右边的坑中,while的目的和上面类似 32 left++; //用左边大于base的元素填充右边的坑, 33 arr[right] = arr[left]; 34 } 35 36 arr[right] = base; //将基准值回归填充到中间 37 38 quickSort(arr,_left,left - 1); //对基准元素左边的元素递归排序 39 quickSort(arr,right + 1,_right);//对基准元素右边的元素递归排序 40 } 41 } 42 }