• 快速排序


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

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

    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);
    
    一开始对过程并不了解,出了不少岔子
    
    ~基准数的选择
    
    自我感觉快排的选取基准数是相当巧妙的
    **!!!!声明:该原理和截图参考	啊哈磊 著《啊哈!算法》,强烈推荐这本算法书入门,简单易懂。**
    
  • 相关阅读:
    HDU 5585 Numbers
    HDU 3308 LCIS
    POJ 2991 Crane
    POJ 1436 Horizontally Visible Segments
    POJ 3667 Hotel
    HaiHongOJ 1003 God Wang
    【SDOI 2008】 递归数列
    5月19日省中提高组题解
    【HDU 1588】 Gauss Fibonacci
    【POJ 3233】Matrix Power Series
  • 原文地址:https://www.cnblogs.com/sepZhang/p/13503750.html
Copyright © 2020-2023  润新知