快速排序

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

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

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);

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

~基准数的选择

自我感觉快排的选取基准数是相当巧妙的
**!!!!声明:该原理和截图参考	啊哈磊 著《啊哈!算法》,强烈推荐这本算法书入门,简单易懂。**
posted @ 2019-08-06 16:14  搞艺术的派大星  阅读(172)  评论(0编辑  收藏  举报