zoukankan      html  css  js  c++  java
  • Java数据结构之排序---快速排序

    快速排序是对冒泡排序的一种改进。

    快速排序的基本思想:

    假设我们以升序为例,它的执行流程可以概括为,每一趟选择当前所有子序列中的一个关键字(通常我们选择第一个,下述代码实现选择的也是第一个数)作为枢纽,将子序列中比枢纽小的移动到枢纽前面,比枢纽大的移动到枢纽的后边;当本趟所有子序列都被枢纽以上述规则划分完毕后会得到新的 一组更短的子序列,我们将这个子序列作为下一趟划分的初始序列集。

    快速排序的图解表示:(该图片是网上找的,下面的代码也是基于这个思想写的)

    快速排序的代码如下:(快速排序的集体讲解会在代码的注释中说明) 

    public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		int[] arr = {-9,78,0,23,-567,70};
    		quickSort(arr, 0, arr.length-1);
    		System.out.println(Arrays.toString(arr));
    	}
    	//我们默认的是以每趟序列的第一个数为基准
    	public static void quickSort(int[] arr,int left,int right){
    		int temp = 0;  //基准
    		int l = left;   //最左边的元素
    		int r = right;  //最右边的元素
    		if(left<right){
    			//我们将这个数组中的第一个数赋值给temp。
    			temp = arr[left];   //temp想当于我们的基准,数列的第一个数
    			while(l!=r){   //我们假定,当l=r的时候退出该循环
    				//开始的时候,我们从最右边开始找元素,当我们找的元素的值大于等于我们的基准,那么我们将它向左移,直到这个元素的值小于基准为止。
    				while(r>l && arr[r]>=temp){  
    					--r;
    				}
    				//此时arr[r]已经小于temp,这个时候我们需要进行一个判断,看看是否还是符合l<r,如果符合的话,我们将arr[r]这个值,直接赋值到左边(数组的第一个值)
    				//并且让我们左边的l指向下一个位置。
    				if(l<r){
    					arr[l] = arr[r];
    					++l;
    				}
    				//在右边换过来之后,我们需要交叉得变换,这个时候我们从左边开始比较
    				//前提还是l<r,只不过由于我们在左边开始,所以我们需要判断arr[l]如果小于temp的值,那么我们应该继续向右移,以知道大于等于temp的值为止。
    				while(l<r && arr[l]<temp){
    					++l;
    				}
    				//此时arr[r]已经大于或者等于temp,这个时候我们需要进行一个判断,看看是否还是符合l<r,如果符合的话,我们将arr[r]这个值,直接赋值到右边(r所在的位置)
    				//并且让我们右边的r指向下一个位置。
    				if(l<r){
    					arr[r] = arr[l];
    					--r;
    				}
    			}
    			//在执行完上面的循环之后,我们除了基准的位置的空的外,基准左边的都小于它,基准右边的都大于它,形成了一个相对有序的序列,
    			//最终我们把之前赋值的temp加入到arr[l]中(因为这个时候r=l)
    			arr[l] = temp;
    			//执行完上面的依次循环之后,我们需要对子序列进行在依次的快速排序,执行过程与上面的相同。
    			quickSort(arr, left, l-1);
    			quickSort(arr, l+1, right);
    		}
    	}
    

      上述代码得到的最终结果如下:

  • 相关阅读:
    deeplearning.ai 卷积神经网络 Week 1 卷积神经网络
    deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II
    deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I
    deeplearning.ai 改善深层神经网络 week3 超参数调试、Batch Normalization和程序框架
    deeplearning.ai 改善深层神经网络 week2 优化算法
    deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面
    cs231n spring 2017 lecture8 Deep Learning Networks
    cs231n spring 2017 lecture7 Training Neural Networks II
    cs231n spring 2017 lecture6 Training Neural Networks I
    cs231n spring 2017 Python/Numpy基础
  • 原文地址:https://www.cnblogs.com/liuzengzhi/p/11758195.html
Copyright © 2011-2022 走看看