快速排序的原理:
- 选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),
比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。 - 一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有
继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比
较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的
值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值
来说,左右两边就是有序的了。
public class sort {
public static void main(String[] args) {
int[] random = random();
sort(random,0,99);
System.out.println(Arrays.toString(random));
}
static int[] random(){
ArrayList<Integer> list = new ArrayList<>();
Random random = new Random();
for (int i=0;i<100;i++){
list.add(random.nextInt(100));
}
System.out.println(list);
int[] arr=list.stream().mapToInt(Integer::valueOf).toArray();
return arr;
}
public static void sort(int arr[],int low,int high){
//后边递归以及下边循环
int start =low;
int end= high;
//设置一个准值
int key=arr[low];
while(end>start){
//从后往前走,如果后边的比准值大那么不变end减一再往前走
while(end>start && arr[end]>=key){
end--;
}
//如果小于准值,那么这两个就换一下位置
if (arr[end]<=key){
int temp=arr[end];
arr[end]=arr[start];
arr[start]=temp;
}
//然后从前往后找
while(end>start && arr[start]<=key){
start++;
}
//遇到比准值大的就丢到后边去
if (arr[start]>=key){
int temp=arr[start];
arr[start]=arr[end];
arr[end]=temp;
}
}
//然后递归
if (start>low){
//这时low是开头,start已经被加到他正好的位置
sort(arr,low,start-1);
}
if (end<high){
sort(arr,end+1,high);
}
}
}