快速排序,顾名思义,是一种速度快,效率高的排序算法。
快排原理:
在要排的数(比如数组A)中选择一个中心值key(比如A[0]),通过一趟排序将数组A分成两部分,其中以key为中心,key右边都比key大,key左边的都key小,然后对这两部分分别重复这个过程,直到整个有序。
整个快排的过程就简化为了一趟排序的过程,然后递归调用就行了。
一趟排序的方法:
1,定义i=0,j=A.lenght-1,i为第一个数的下标,j为最后一个数下标;
2,从数组的最后一个数Aj从右往左找,找到第一小于key的数,记为Aj;
3,从数组的第一个数Ai 从左往右找,找到第一个大于key的数,记为Ai;
4,交换Ai 和Aj
5,重复这个过程,直到 i=j
6,调整key的位置,把A[i] 和key交换
总结一下就是:找基准数,小的往左边放,大的往右边放,通过递归再分别循环操作,当开始和结束位置重合了就结束递归(左右的数互相替换)
package myself;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int arr[]= {6,9,5,3,45,89,526,2,0,98,36,96,6,7,8};
quicksort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void quicksort(int arr[],int start,int end) {
int jzs=arr[start];//把数组中的第0个数字作为标准值
int low=start;//记录需要排序的下标
int high=end;
if(low<high) {
while(low<high) {
//右边的数比标准数大
while(low<high&&jzs<=arr[high]) {
high--;
}
arr[low]=arr[high];//使用右边的数字替换左边的数
while(low<high&&jzs>=arr[low]) {
low++;
}
arr[high]=arr[low];
}
arr[low]=jzs;//把标准数赋给低所在的元素
quicksort(arr, start, low);//左边序列排序
quicksort(arr, low+1, end);//右边序列排序
}
}
}