快速排序算法(图文并茂)

快速排序/快排

首先理解算法思路

由于不打算自己再画图,图作者为:https://blog.csdn.net/nrsc272420199/article/details/82587933

  1. 假设最开始的基准数据为数组第一个元素23,则首先用一个临时变量去存储基准数据,即tmp=23;然后分别从数组的两端扫描数组,设两个指示标志:low指向起始位置,high指向末尾.
    在这里插入图片描述
  2. 先从后半部分开始,如果扫描到的值大于基准数据就让high减1,如果发现有元素比该基准数据的值小(如上图中18<=tmp),就将high位置的值赋值给low位置 ,结果如下:
    在这里插入图片描述
  3. 后开始从前往后扫描,如果扫描到的值小于基准数据就让low加1,如果发现有元素大于基准数据的值(如上图46=>tmp),就再将low位置的值赋值给high位置的值,指针移动并且数据交换后的结果如下:
    在这里插入图片描述
  4. 然后再开始从后向前扫描,原理同上,发现上图11<=tmp,则将high位置的值赋值给low位置的值,结果如下:
    在这里插入图片描述
  5. 然后再开始从前往后遍历,直到low=high结束循环,此时low或high的下标就是基准数据23在该数组中的正确索引位置.如下图所示.
    在这里插入图片描述

个人理解

我觉得就是随便抽个数,然后把小于他的放左边,大于他的放右边去,做这个过程采用哨兵模式,左边一个哨兵,右边一个哨兵,都往中间走,一直到哨兵重合,那么就是最中间的点了,再把那个抽到的数放在这个重合点,这样这个数的左边的都是小的数,右边的都是大的数,然后对左边的递归做这个操作,对右边的递归做这个操作,最后就完成了排序。

代码来理解

  • 代码(简洁版)
public static void quickSort(int[] array,int low,int high){
        if(high>low){
            int i=low,j=high;
            int temp=array[low];
            while (low!=high){
                while (high>low && array[high]>=temp) {
                    high--;
                }
                array[low]=array[high];
                while (low<high && array[low]<=temp){
                    low++;
                }
                array[high]=array[low];
            }
            array[low]=temp;
            quickSort(array,i,low-1);
            quickSort(array,low+1,j);
        }
    }

  • 代码(带提示完整版本)
package sort;

/**
 * @author humorchen
 */
public class QuickSort {
    public static void quickSort(int[] array,int low,int high){
        if(high>low){
            int i=low,j=high;
            int temp=array[low];
            System.out.println(String.format("取下标为 %d 的数 %d 为对比数",low,temp));
            while (low!=high){
                print(array);
                while (high>low && array[high]>=temp) {
                    high--;
                }
                System.out.println(String.format("在右边往左边找比对比数小的数,找到了array[%d] 的数 %d ,把这个数放到array[%d]对比数的位置那去",high,array[high],low));
                array[low]=array[high];
                print(array);
                while (low<high && array[low]<=temp){
                    low++;
                }
                System.out.println(String.format("在左边往右边找比对比数大的数,找到了array[%d]的数 %d ,把这个数放到array[%d]刚找到的大于对比数的位置那去",low,array[low],high));
                array[high]=array[low];
                print(array);
            }
            System.out.println("把对比数放到最中间");
            array[low]=temp;
            print(array);
            System.out.println(String.format("将对比数array[%d]=%d 两边递归做处理",low,array[low]));
            quickSort(array,i,low-1);
            quickSort(array,low+1,j);
        }
    }
    public static void print(int[] array){
        System.out.println("打印现在的数据");
        for(int t:array){
            System.out.print(t+" ");
        }
        System.out.println();
    }
    public static void main(String[] args) {
        int[] array={3,4,2,5,6,1,3,7};
        quickSort(array,0,array.length-1);
        print(array);
    }
}

posted @ 2021-02-22 17:59  HumorChen99  阅读(0)  评论(0编辑  收藏  举报  来源