通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,以此达到整个数据变成有序序列。
算法描述:
1,从序列中挑出一个元素,称为枢点(pivot)元素。
2,重新排序,使得比枢点元素小的所有元素都放在枢点的前面,而比枢点元素大的所有元素都放在枢点的后面。在这个分区退出之后,该枢点就序列的中间位置。这个操作称为分区(partition)操作。
3,递归地(recursive)把小于枢点元素的子序列和大于枢点元素的子序列排序。
动图演示:

代码实现:
public class Sort{ public static void swap(int[] arr,int i,int j){ int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } public static void printArr(int[] arr){ for(int i:arr){ System.out.print(i+" "); } } public static void quickSort(int[] arr,int low,int high){ if(low<high){ int mid=partition(arr,low,high); quickSort(arr,low,mid-1); quickSort(arr,mid+1,high); } } //分区操作,查找枢点元素的位置 public static int partition(int[] arr,int low,int high){ int pivot=low; int x=arr[low]; for(int i=low;i<=high;i++){ if(x>arr[i]){ pivot=pivot+1; if(pivot!=i){ swap(arr,pivot,i); } } } swap(arr,pivot,low); return pivot; } public static void main(String[] args){ int[] arr=new int[]{3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}; int low=0,high=arr.length-1; quickSort(arr,low,high); printArr(arr); } }
posted on
浙公网安备 33010602011771号