快速排序
1.基本思想
一次快排的主要思路:
(1)取第一个值为low,取最后一个值为high
(2)设置一个临时变量tmp将low的值放进去,当low和high不在同一个位置的时候。
(3)先从high开始往前找比low小的值,找到就就将该值存储到low的位置,没有找到就让high继续往前找,直到找到或者low和high的位置相同为止。
(4)当找到high,再从low+1开始往后找比low大的值,如果找到就赋给high,没有找到就继续往后找直到找到或者low和high的位置相同为止。
(5)循环放置一遍以后,low和high“相遇”,此时将tmp中的值放入该位置。一次快排就完成啦!
(6)此时tmp放置的位置就是后续快排的基准,从下一次开始将数组以基准为界限分成左右两部分再次进行快排,直到每一边左右两边的值小于1个停止排序。
2.图解
3.代码实现
/**
* Created with IntelliJ IDEA
*
* @Description:快速排序
* @Author: zhen
* @Date: 2019/8/18
* @Time: 0:27
*/
public class SortTest1 {
//一次快排找基准
public static int partion(int[] array,int low,int high){
int tmp = array[low];
while(low < high){
while(low < high && array[high] >= tmp){
high --;
}
if(low >= high){
break;
}else{
array[low] = array[high];
}
while(low < high && array[low] <= tmp){
low++;
}
if(low >= high) {
break;
}else{
array[high] = array[low];
}
}
array[low] = tmp;
return low;
}
//分组实现快排
public static void quick(int[] array,int start,int end){
//找基准
int par = partion(array,start,end);
//判断左边是否只剩一个元素
if(par > start+1){
quick(array,start,par-1);
}
if(par < end -1){
quick(array,par+1,end);
}
}
public static void quickSort(int[] array){
quick(array,0,array.length-1);
}
public static void main(String[] args) {
int[] array = new int[100];
Random random = new Random();
for (int i = 0; i <array.length ; i++) {
array[i] = random.nextInt(100)+1;
}
quickSort(array);
System.out.println(Arrays.toString(array));
}
}