java快速排序的原理:
1.在一个数组中,我们想要进行快速排序操作时,必须要先把数组中的一个数设为基准数(base),通常把最左边的数当做基准数
2.定义两个指针左指针(left)和右指针(right),指针先从右侧开始检索,当检索到比基准数小的数时停止,然后左侧指针开始检索,检索比基准数大的数时停止
3.两个指针都检索到并停止之后,交换两个数,然后继续2中的操作
4.当两个指针相遇时,交换指针所在位置的数和基准数,交换完之后,基准数已经归位,并且左边的数都比它小,右边的数都比它大。
5.接着以基准数为中心分成两侧,分别重复进行上述操作,在不符合循环条件时结束,排序完成。
备注:每次交换完基准数和两个指针相交的数后,基准数必定归位。
也可以用最右边的数当基准数,一样的道理。
创建一个方法,参数有一个数组,一个左指针和一个右指针
public static void quickSort(int arr[],int left,int right){
//进行判断,左边索引不可以比右边索引大,如果左边比右边大那么排序结束
if (left>right){
return;
}
int baseNum=arr[left];//基准数
int i=left;//左指针
int j=right;//右指针
//i和j不相遇时,在循环中进行检索,
while(i!=j){
//j从右往左进行检索比基准数小的,如果检索到比基准数小的就停下
while (arr[j]>=baseNum && i<j){
j--;//从右往左检索
}
//i从左往右进行检索比基准数大的,如果检索到比基准数大的就停下
while (arr[i]<=baseNum && i<j){
i++;//从左往右检索
}
//在都检索到之后,停下并交换i和j
int temp=arr[i];
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
//跳出循环时,代表i和j相遇,此时交换相遇位置的数和基准数
//将两个指针相交处的元素换到最左边
arr[left]=arr[i];
//将基准数,也就是最左边的数换到相交处
arr[i]=baseNum;
//此时,左边的数都比基准数小,右边的都比基准数大
//之后分别排基准数的左边和右边
//调用方法,重复进行
quickSort(arr,left,i-1);//归位后的基准数左边
quickSort(arr,j+1,right);//归位后的基准数右边
}
下面进行测试:
public static void main(String[] args) {
//创建数组
int[] arr=new int[]{6,51,64,32,19,95,14,3,45};
quickSort(arr,0, arr.length-1); //调用方法进行排序
System.out.println(Arrays.toString(arr)); //输出数组
}
测试结果如下:
可以测试一下程序运行时间,运行效率比普通排序方法要快很多。