• Java快速排序第二谈


    之前做过快速排序,今天重温了一下,觉得快排的思想很经典,再次巩固一下

    何谓快排?
    分区,排序,递归的三重奏
    首先找到一个基准用来分区,从哪里开始分区?基准从何而来?
    基准我们默认左边第一个,(当一个数组是逆序的时候,速度会变慢,基准还可以随机生成)
    如这六个数字,排序的步骤如下
    3 7 8 9 2 4
    3 2 8 9 7 4(交换2和7)
    第一次找到2和7交换后,j–继续找,找到和i相等的位置2,交换3和2
    2 3|| 8 9 7 4
    在这里插入图片描述
    第几次交换的位置是返回的j的位置,根据打印的信息,返回的是j的大小
    所以可以知道,第一次j的大小是1,对应的数字就是2,所以交换2和3
    再将2 3作为左边的进行递归,8 9 7 4作为右边的进行递归

    代码如下

    /*
     * 编程实现快速排序算法,深入理解快速排序算法的基本思想。
     */
    /*
     * 
    输入 
    
    多组输入,每组第一个数字为数组长度,然后输入一个一维整型数组。 
    
    输出 
    
    输出快速排序之后的一维整型数组(升序) 
    
    
    样例输入 Copy 
    
    6 1 8 6 5 3 4
    5 12 42 2 5 8
    
    
    
    
    样例输出 Copy 
    
    1 3 4 5 6 8
    2 5 8 12 42
    
     */
    import java.util.Scanner;
    
    public class QuickSort快速排序 {
    	static int time =1;
    
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner sc=new Scanner(System.in);
    		int n=sc.nextInt();
    		int arrayA[]=new int[n];
    		for(int i=0;i<n;i++) {
    			arrayA[i]=sc.nextInt();
    		}
    		quickSort(arrayA,0,n-1);
    		for(int i=0;i<n;i++) {
    			System.out.print(arrayA[i]+" ");
    		}
    	}
    
    	private static void quickSort(int[] arrayA, int i, int j) {
    		if(i<j) {
    		// TODO Auto-generated method stub
    		int position=position(arrayA,i,j);
    		quickSort(arrayA,i,position-1);
    		quickSort(arrayA,position+1,j);
    		}
    		
    	}
    
    	private static int position(int[] arrayA, int left, int right) {
    		int temp=arrayA[left];
    		int j=right+1;
    		int i=left;
    		while(true) {
    			while(arrayA[++i]<temp&&i<right) {
    				
    			}
    			while(arrayA[--j]>temp) {
    				
    			}
    			if(i>=j) {
    				break;
    			}
    			swap(arrayA,i,j);
    		}
    		arrayA[left]=arrayA[j];
    		arrayA[j]=temp;	
    		System.out.println("第"+time+"次交换的位置是"+j);
    		time++;
    		return j;
    	
    		
    	}
    
    	private static void swap(int[] arrayA, int i, int j) {
    		
    	 int temp=arrayA[i];
    	 arrayA[i]=arrayA[j];
    	 arrayA[j]=temp;
    		
    	}
    
    }
  • 相关阅读:
    .net调用存储过程详解
    SQL SERVER 与ACCESS、EXCEL的数据转换
    dedecms 织梦 获取文章链接地址
    用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
    SQL Server触发器创建、删除、修改、查看示例步骤
    (后缀数组模板)BZOJ1031[JSOI2007]字符加密Cipher
    LOJ2055「TJOI / HEOI2016」排序
    BZOJ1096[ZJOI2007]仓库建设
    POI2011Meteors
    数位dp(1)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309682.html
Copyright © 2020-2023  润新知