java快速排序算法最易懂的解释!

快速排序的基本实现思想:

  • 选取数组的第一个元素作为基准值key。
  • 从数组最后一个元素high开始依次向前与key进行比较分区,将不小于key的数全放到它的右边,不大于key的数全放到它的左边。
  • 比较交换之后以key下一个元素为基准再对左右区间重复第二步,直到各区间只有一个数

算法的具体实现:
在这里插入图片描述
根据基本思想描述,在上图已经标出了key和最后一个元素high


在这里插入图片描述
key开始与最后一个元素比较,也就是4与34比较,因为思想中需要将不小于key的数全放到它的右边,所以4比34小会继续与33进行比较,以此类推,当比较到3时,key与3进行交换,key为索引0不变,重新从最后一个元素从后往前进行比较,直到这个key右边全是比它大的数。从图中做了标记,no表示不交换,yes表示交换。


根据思想key为下一个元素,重复上面的步骤。
在这里插入图片描述
只能与4进行交换,下面是交换结果:
在这里插入图片描述


key为索引2时,没有发生交换,因为右边都是大于索引2的数。
在这里插入图片描述
既然没有交换,则key的索引+1


在这里插入图片描述
交换之后,key索引保持不变,继续与最后一个索引进行比较,以此类推。
在这里插入图片描述
在这里插入图片描述
最后的交换成果:
在这里插入图片描述
key索引继续+1,在进行比较,因为原理一样,就不再阐述了,而且举例的这个数组已经排序完了,所以直接显示最终的排序结果:
在这里插入图片描述
代码实现如下:

//low是定义一个变量作为key
//high为数组最后一个元素
 public static void sort(int[] arr,int low,int high){
      int i,j,key,t;
       if(low>high){
           return;
       }
       i=low;
       j=high;
       //key就是基准位
       key = arr[low];

       while (i<j) {
           //先看右边,依次往左递减
           while (key<=arr[j]&&i<j) {
               j--;
           }
           //再看左边,依次往右递增
           while (key>=arr[i]&&i<j) {
               i++;
           }
           //如果满足条件则交换
           if (i<j) {
               t = arr[j];
               arr[j] = arr[i];
               arr[i] = t;
           }

       }
       //最后将基准为与i和j相等位置的数字交换
       arr[low] = arr[i];
       arr[i] = key;
       //递归调用左半数组
       sort(arr, low, j-1);
       //递归调用右半数组
       sort(arr, j+1, high);
   }
   public static void main(String[] args) {
       // TODO Auto-generated method stub
      int[] arr =new int[]{4,12,3,52,15,33,34};
       sort(arr,0,6);
        for (int i = 0; i < arr.length; i++) {
           System.out.println(arr[i]);
       }
  }

得到如下结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/fight252/article/details/90814870