1.快速排序的排序思想
快速排序的算法思想是分治法,比大小,再进行分区。 |
1.首先从数组中取出第一个数作为基准数 。 |
2.将这个数大于或者等于的数全放在它的右边,小于它的数放在它的左边。 |
3.再对左右区间重复操作第二步,直到各区间只有一个数。 |
核心思想:分治法
快速排序的流程是:
元素的移动:填坑法
挖坑填数的实现思路 |
1.将基准数挖出形成第一个坑 |
2.由后往前找比它小的数,找到后挖出此数,填到前一个坑中 |
3.由前往后找比它大于或等于的数,找到后,也挖出此数,填到前一个坑中 |
4.在重复进行执行第二步与第三步的操作 |
对于数组{5,3,9,1,6,7,2,4,0,8}进行快速排排序
挖坑填数第一轮:
如此进行重复挖坑填数的第2与第3步操作,即可完成最终的顺序
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);
}
}
/*
挖坑填数:1.将基准数挖出来形成第一个坑
2.由后往前找到比它小的数,找到后挖出此数填到前一个坑
3.由前往后找到比它大于等于的数,找到后也挖出此数填到前一个坑
4.再重新执行2.3操作步骤
*/
private static int getIndex(int[] arr, int start, int end) {
int i=start;
int j=end;
//定义基准数
int x=arr[i];
//重复2,3步骤
while(i<j){
//2.由后往前找比它小的数,找到后挖出此数填到前一个坑中
while(i<j&&arr[j]>=x){
j--;
}
//找到后挖出此数,填到前一个坑中
if(i<j){
arr[i]=arr[j];
i++; //找到后让i顺便递增下
}
//3.由前往后找到比它大或等于的数,找到后也挖出此数,填到前一个坑中
while(i<j&&arr[i]<x){
i++;
}
//找到后也挖出此数填到前一个坑中
if(i<j){
arr[j]=arr[i];
j--;//顺便让j再减一下
}
}
//把基准数填到最后一个坑中
arr[i]=x;
return i;//返回基准数所在的索引位置
}
}
import java.util.Arrays;
public class MyTest {
public static void main(String[] args) {
int [] arr={24, 6, 80, 57, 13, 2, 0, 3, 8, 200, -4, 5, 0, 500, 20};
QuickSortUtils.quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
}