快速排序
原理: 在我们需要进行排序的数组中挑选出一个标准数(一般是第一位 )
例如:
[12,56,98,6,8,1,23,89,78,96] 将12 作为首位
=》 [(),56,98,6,8,1,23,89,78,96]
接下来 从右向左看 遇到比12小的数字不变 遇到比12小的数字就将该数字填入到括号中 并将其位置设置为一个新的括号,为其他数字的填入做准备
=》 [(1),56,98,6,8,(),23,89,78,96]
然后从左边依次寻找比标准数字大的数 放入括号并形成新的括号
=》 [(1),(),98,6,8,(56),23,89,78,96]
之后再从 (56)想左找 循环上面的过程
[(1),(8),(6),(),(98),(56),23,89,78,96]
当从两个方向进行比较的时候 开始的位置重合的话 就将12 填入 首次排序结束 之后就是 以标准数字所在位置作为分界点 左右两侧重复之前的操作 直到排序完成
代码实现:
public class QuickSort {
public static void main(String[] args) {
// 交换排序之快速排序
int[] arr=new int[]{12,56,78,3,35,37,64,96};
sort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void sort(int [] arr,int start,int end){
//设置递归结束的条件
if(start<end){
//选取第一个数字作为标准数字
// 不写arr[0]的原因在于 后面的排序中 标准数字后面的那一位下标不为0
int stard=arr[start];
//设置() 的位置
int low=start;
int high=end;
//low<high 将数据分为左右两部分 即一边小一边大
while(low<high){
//进行比较 low high 括号的位置 确定 最后的结束条件
while(low<high&&stard<=arr[high]){
high--;
}
//实现向括号里面的填充
arr[low]=arr[high];
//从左开始的比较
while(low<high&&stard>=arr[low]){
low++;
}
arr[high]=arr[low];
}
//将标准值放到最后的括号中
arr[low]=stard; //放到 low或者是 start都是可以的
sort(arr,start,low);
sort(arr,low+1,end); //递归的方式
}
}
}