• 快速排序


    你最需要的–快速排序的详解

    ·废话少说,呈上快排的代码

    package ajie.java.sort;
    
    import java.util.Scanner;
    
    public class QuikSort {
    	public static void quickSort(int[] arrars,int left,int right){
    	        int i,j,temp,t;
    	        if(left>right){
    	            return;
    	        }
    	        i=left;
    	        j=right;
    	        //temp就是基准位
    	        temp = arrars[left];
    	 
    	        while (i<j) {
    	            //先看右边,依次往左递减
    	            while (temp<=arrars[j]&&i<j) {
    	                j--;
    	            }
    	            //再看左边,依次往右递增
    	            while (temp>=arrars[i]&&i<j) {
    	                i++;
    	            }
    	            //如果满足条件则交换
    	            if (i<j) {
    	                t = arrars[j];
    	                arrars[j] = arrars[i];
    	                arrars[i] = t;
    	            }
    	 
    	        }
    	        //最后将基准为与i和j相等位置的数字交换
    	        arrars[left] = arrars[i];
    	        arrars[i] = temp;
    	        //递归调用左半数组
    	        quickSort(arrars, left, j-1);
    	        //递归调用右半数组
    	        quickSort(arrars, j+1, right);
    	    }
    	    public static void main(String[] args){
                //创建一个简单的数组
    	        int[] arrays = {9,5,2,3,7,72,3,4,34,1,2,34,29};
                /*
                *也可以换成下面的代码自己输入数字
                */
    //	    	Scanner scanner = new Scanner(System.in);
    //	    	System.out.println("请输入数据的个数:");
    //	    	int sum = scanner.nextInt();
    //	    	int arrays[] = new int [sum];
    //	    	System.out.println("请输入"+sum+"个0——100的整数:");
    //	    	for (int i = 0; i < arrays.length; i++) {
    //	    		arrays[i] = scanner.nextInt();
    //	    	}
    	        quickSort(arrays, 0, arrays.length-1);
    	        for (int i = 0; i < arrays.length; i++) {
    	            System.out.println(arrays[i]);
    	        }
    	    }
    	
    }
    
    

    ·说一下快排的原理(要是知道可以跳过,很多博主都有写过)

    快速排序的基本原理就是“二分法”,尽量减少计算步骤,提高效率–将序列切分,一次比较。

    1.将初始序列从两端开始比较,比较的基准数为每次截取数列的最左边的数。左边取i记录比较进度,右边取j记录。从j(右端)开始找到一个小数(比基准数小的)就停止,换成i(左端)比较,知道i找到一个大数(比基准数大的)也同样停止。

    [外链图片转存失败(img-fuPDoiuA-1565078918460)(assets/1-1.png)]

    2.交换j发现的小数和j发现的大数,后依然用刚才的基准数。继续向中间前进!!

    (嘿嘿,每次都是j先出发哦)

    [外链图片转存失败(img-ROdchZ6B-1565078918462)(assets/1-2-1564378206908.png)]

    3.重复步骤2,直到–j==i,就是j和i指向一个数字,停止第一轮比较,并把最左边的基准数拿到这个位置。现在这个点就是中位数点,点的左边是小数(小于或等于基准数),点的右边是大数(大于或等于基准数)。

    4.重复截取数列,直到全部数列比较完成。就欧克了。

    [外链图片转存失败(img-57wfO7CN-1565078918465)(assets/1-4.png)]

    &操作的过程如下图:

    [外链图片转存失败(img-dtaSLPr2-1565078918466)(assets/1-5-1564379320128.png)]

    !!!!该原理和截图参考 啊哈磊 著《啊哈!算法》,强烈推荐这本算法书入门,简单易懂。

    ·写代码过程中遇到的难点

    ~return

     if(left>right){
    	            return;
    	        }
    

    快排的核心就是,return结合递归一边一边的调用二分法,达到排序的目的.

    ~运算的实际过程

    //递归调用左半数组
    	        quickSort(arrars, left, j-1);
    	        //递归调用右半数组
    	        quickSort(arrars, j+1, right);
    

    一开始对过程并不了解,出了不少岔子

    ~基准数的选择

    自我感觉快排的选取基准数是相当巧妙的
    !!!!声明:该原理和截图参考 啊哈磊 著《啊哈!算法》,强烈推荐这本算法书入门,简单易懂。

    递归调用右半数组
    	        quickSort(arrars, j+1, right);
    
    一开始对过程并不了解,出了不少岔子
    
    ~基准数的选择
    
    自我感觉快排的选取基准数是相当巧妙的
    **!!!!声明:该原理和截图参考	啊哈磊 著《啊哈!算法》,强烈推荐这本算法书入门,简单易懂。**
    
  • 相关阅读:
    Java线程:新特征-阻塞栈
    Java线程:新特征-阻塞队列
    Java线程:新特征-信号量
    Java线程:新特征-锁(下)
    Java线程:新特征-锁(上)
    Java线程:新特征-有返回值的线程
    Java线程:新特征-线程池
    Java线程:volatile关键字
    Java线程:并发协作-死锁
    通过Roslyn动态生成程序集
  • 原文地址:https://www.cnblogs.com/sepZhang/p/13503750.html
Copyright © 2020-2023  润新知