• 直接插入排序的再再改进


    import java.util.Arrays;
    import java.util.Scanner;
    
    public class aaa {
    		
    	static void bubble(int a[],int n){
    		for(int i=0;i<n-1;i++){
    			for(int j=0;j<=n-2-i ;j++){
    				if(a[j]>a[j+1]){ //循环遍历,枚举出i位置每个值,若大于后者则移动
    					int temp=a[j];
    					a[j]=a[j+1];
    					a[j+1]=temp;					
    				}
    			}
    		}
    	}
    	static int max(int a,int b){
    		if(a<b) return b;
    		return a;
    	}
    	static int min(int a,int b){
    		if(a>b) return b;
    		return a;
    	}
    	static void enhance(int a[],int n){
    		for(int i=3;i<=n-3;i=i+3){ //进行2趟排序
    			
    			for(int j=i;j>=3;j=j-3){//枚举遍历出j的每个位置的值
    				if( a[j]>a[j-3] ) break;
    	if(  a[j]==a[j-3]  &&  max( a[j+1],a[j+2])>max(a[j-2],a[j-1]) ) break;
    				if(  a[j]==a[j-3]  &&  
    				max( a[j+1],a[j+2])== max(a[j-2],a[j-1]) &&
    				min( a[j+1],a[j+2])>= min(a[j-2],a[j-1]) ) break;
    				
    				//进入交换
    				int a1=a[j-3],a2=a[j-2],a3=a[j-1];
    				a[j-3]=a[j]; a[j-2]=a[j+1];a[j-1]=a[j+2];
    				a[j]=a1;  a[j+1]=a2;  a[j+2]=a3;
    				
    				//准备下次循环			
    			}		
    		}
    	}
    	
    	
    
    
    	static void enhance1(int a[],int n){
    		for(int i=3;i<=n-3;i=i+3){
    			int a0=a[i],a1=a[i+1],a2=a[i+2];//挖坑
    			int j=i-3;
    			for(;j>=0;j=j-3){
    				if(a[j]>a0 || (a[j]==a0&&max(a[j+1],a[j+2])>max(a1,a2))||
    						a[j]==a0&&max(a[j+1],a[j+2])==max(a1,a2)&&
    						min(a[j+1],a[j+2])>min(a1,a2))//则需要移动
    					{a[j+3]=a[j];a[j+4]=a[j+1];a[j+5]=a[j+2];}
    				else 
    					break;//则不需要移动
    				
    			}
    			if((j+3)!=i) {a[j+3]=a0;a[j+4]=a1;a[j+5]=a2;}
    		}
    		System.out.println(Arrays.toString(a));
    	}
    	
    	
    
    
    	static void delete(int a[],int n){
    		int i=0;//指向有序表
    		if(a[2]>a[1]) {int temp =a[1]; a[1]=a[2];a[2]=temp;}
    		for(int j=3;j<n;j=j+3){//一直向后枚举遍历
    			if( a[j]==a[i] && 
    			    max(a[j+1],a[j+2]) ==max(a[i+1],a[i+2]) &&
    			    min(a[j+1],a[j+2]) ==min(a[i+1],a[i+2])
    			   )
    				continue;
    				
    			i = i+3;
    			a[i] = a[j]; 
    		   //操纵一片区域
    		    if( a[j+1]>a[j+2] ) {a[i+1]=a[j+1];a[i+2]=a[j+2];}
    		    else {int b1=a[j+2]; int b2= a[j+1];a[i+1]=b1;a[i+2]=b2;}
    		}
    		for(int k=0;k<=i;k=k+3){
    			System.out.println(a[k]+" "+a[k+1]+" "+a[k+2]);
    		}
    	}
    	/**
    	 * 2 1 1
    	 * 1 2 1
    	 * 2 1 1
    	 * 1 2 1
    	 * 1 2 1
    	 * 2 4 2
    	 * 先进行按照第三位的关键字进行排序
    	 * 对1分组,按照第二位的关键字进行排序
    	 * 对2分组,按照第二位的关键字排序
    	 */
    	
    	
    	
    	public static void main(String args[]){
    		 Scanner s = new Scanner(System.in);
    		 int i = s.nextInt(); //输入有多少次测试
    		 for(int k=0;k<i;k++){
    	     int i1 = s.nextInt(); //多少组
    	     int array[]=new int[3*i1];
    	     for(int k1=0;k1<3*i1;k1++){
    	    	 array[k1]=s.nextInt();
    	     }
    		 enhance1(array,array.length);
    		 delete(array,array.length);
    		 }
    		
    	}
    
    }
    

      

  • 相关阅读:
    python 操作ie登陆土豆网
    python网络编程学习笔记(3):socket网络服务器
    python趣味编程:借书方案(排列组合)
    扑克牌洗牌
    C#开发的两个原则的深入讨论(转)
    软件文档知多少?(转)
    反射点滴Common
    使用ASP.NET加密口令(转)
    asp.net 备份和恢复SQL SERVER 数据库
    编程规范程序员们都应该这样写代码(转)
  • 原文地址:https://www.cnblogs.com/cs-lcy/p/7265147.html
Copyright © 2020-2023  润新知