之前做过快速排序,今天重温了一下,觉得快排的思想很经典,再次巩固一下
何谓快排?
分区,排序,递归的三重奏
首先找到一个基准用来分区,从哪里开始分区?基准从何而来?
基准我们默认左边第一个,(当一个数组是逆序的时候,速度会变慢,基准还可以随机生成)
如这六个数字,排序的步骤如下
3 7 8 9 2 4
3 2 8 9 7 4(交换2和7)
第一次找到2和7交换后,j–继续找,找到和i相等的位置2,交换3和2
2 3|| 8 9 7 4
第几次交换的位置是返回的j的位置,根据打印的信息,返回的是j的大小
所以可以知道,第一次j的大小是1,对应的数字就是2,所以交换2和3
再将2 3作为左边的进行递归,8 9 7 4作为右边的进行递归
代码如下
/*
* 编程实现快速排序算法,深入理解快速排序算法的基本思想。
*/
/*
*
输入
多组输入,每组第一个数字为数组长度,然后输入一个一维整型数组。
输出
输出快速排序之后的一维整型数组(升序)
样例输入 Copy
6 1 8 6 5 3 4
5 12 42 2 5 8
样例输出 Copy
1 3 4 5 6 8
2 5 8 12 42
*/
import java.util.Scanner;
public class QuickSort快速排序 {
static int time =1;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int arrayA[]=new int[n];
for(int i=0;i<n;i++) {
arrayA[i]=sc.nextInt();
}
quickSort(arrayA,0,n-1);
for(int i=0;i<n;i++) {
System.out.print(arrayA[i]+" ");
}
}
private static void quickSort(int[] arrayA, int i, int j) {
if(i<j) {
// TODO Auto-generated method stub
int position=position(arrayA,i,j);
quickSort(arrayA,i,position-1);
quickSort(arrayA,position+1,j);
}
}
private static int position(int[] arrayA, int left, int right) {
int temp=arrayA[left];
int j=right+1;
int i=left;
while(true) {
while(arrayA[++i]<temp&&i<right) {
}
while(arrayA[--j]>temp) {
}
if(i>=j) {
break;
}
swap(arrayA,i,j);
}
arrayA[left]=arrayA[j];
arrayA[j]=temp;
System.out.println("第"+time+"次交换的位置是"+j);
time++;
return j;
}
private static void swap(int[] arrayA, int i, int j) {
int temp=arrayA[i];
arrayA[i]=arrayA[j];
arrayA[j]=temp;
}
}