通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,以此达到整个数据变成有序序列。

算法描述:

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 2018-07-18 20:12  会飞的金鱼  阅读(163)  评论(0)    收藏  举报