八大排序-快速排序(五)
-
快速排序(分治法:比大小、再分区):
- 从数组中取出一个数,作为基准数
- 分区:将比这个数大或等于的数放在他的右边,小于他的数全放到他的左边
- 再对左右区间重复第二步,直到各区间只有一个数
-
填坑方法:
-
将基准数挖出形成第一个坑
-
由后向前找比她小的数,找到后挖出此数填到前一个坑中/
-
由前向后找比他大或等于的数,找到后也挖出此数填到前一个坑中
-
在再重复执行2、3两步骤
-
-
先建一个测试类ArraySortTest
public class ArraySortTest { public static void main(String[] args) { //定义一个数组 int[] arr={10,3,5,6,1,0,100,40,50,8,-1,-3-2}; //调用工具类,进行快速排序,传入数组,传入起始位置,传入结束位置 QuickSortUtils.quickSort(arr,0,arr.length-1); //输出排序后的结果 System.out.println(Arrays.toString(arr)); } }
-
再建一个工具类QuickSortUtils,实现快速排序。
public class QuickSortUtils { //快速排序 public static void quickSort(int[] arr,int start,int end){ //找出分左右两区的索引位置,然后对左右两区进行递归调用 if (start<end){ int index=getIndex(arr,start,end); quickSort(arr,start,index-1); quickSort(arr,index+1,end); } } //将基准数挖出形成第一个坑 //由后向前找比她小的数,找到后挖出此数填到前一个坑中 // 由前向后找比他大或等于的数,找到后也挖出此数填到前一个坑中 //在再重复执行2、3两步骤 private static int getIndex(int[] arr, int start, int end) { int i=start; int j=end; int x=arr[i]; while (i<j){ //由后向前找比她小的数,找到后挖出此数填到前一个坑中 while (i<j&&arr[j]>=x){ j--; } if (i<j){ arr[i]=arr[j]; i++; } // 由前向后找比他大或等于的数,找到后也挖出此数填到前一个坑中 while (i<j&&arr[i]<x){ i++; } if (i<j){ arr[j]=arr[i]; j--; } } arr[i]=x;//把基准数填到最后一个坑中 return i;//最i和j 是相等的,返回哪个一个都可以 } }