排序

測試類

public class Testmysort {
	public static void main(String[] args) throws IOException {
		int n,e,f;
		Vnode[] data=null;
		ArrayList<Vnode> list=new ArrayList<Vnode>();
	    BufferedReader br=new BufferedReader(new FileReader("123.txt"));
	    String str1=br.readLine();
	    String[] str;
	    while((str1=br.readLine())!=null){
	    	Vnode node =new Vnode();
	    	str=str1.split(" ");
	    	node.name=str[0].trim();
            node.Chinese=Integer.parseInt(str[1].trim());
            node.Math=Integer.parseInt(str[2].trim());
            node.English=Integer.parseInt(str[3].trim());
            node.sum=node.Chinese+node.Math+node.English;
            list.add(node);
	    }
	    br.close();
	    data=new Vnode[list.size()];
	    list.toArray(data);
	    Scanner read=new Scanner(System.in);
	    Mysort gg=new Mysort(data);
	    System.out.println("------------------------");
		System.out.println("操作選項菜單:");
		System.out.println("1.按語文名字排序");
		System.out.println("2.按數學成績");
		System.out.println("3.按英語成績");
		System.out.println("4.按總分排序");
		System.out.println("0.退出");
		System.out.println("------------------------");
		do{
			System.out.println("請輸入操作選項:");
			e=read.nextInt();
			switch(e){
			  case 1:{
		  		  System.out.println("1.直接插入排序 2.希爾排序");
		  		  f=read.nextInt();
		  		  if(f==1){
		  			  gg.insertSort();
		  		  }else{
		  			  gg.shellSort();
		  		  }
		  		  break;
		  	  }
		  	  case 2:{
		  		  System.out.println("1.直接選擇排序 2.希堆排序");
		  		  f=read.nextInt();
		  		  if(f==1){
		  			   gg.selectSort();
		  		  }else{
		  			  gg.heapSort();
		  		  }
		  		  break;
		  	  }	
		  	  case 3:{
		  		  System.out.println("1.冒泡排序  2.快速排序");
		  		  f=read.nextInt();
		  		  if(f==1){
		  			  gg.bubbleSort();
		  		  }else{
		  			  gg.quickSort();
		  		  }
		  		  break;
		  	  }	
		  	  case 4:{
		  	      System.out.println("1.二路歸併排序  2.基數排序");
		  	      f=read.nextInt();
		  		  if(f==1){
		  			  gg.mergeSort();
		  		  }else{
		  			  gg.radixSort();
		  		  }
		  		  break;
		  	  }	
			}
			
		}while(e!=0);
		read.close();
	}

}
主方法類 主要有5類常用排序算法  插入排序 選擇排序 交換排序 並歸排序 基數排序 

public class Mysort{ 
	Vnode[] data=null;
	Vnode[] data1=null;
	public Mysort(Vnode[] data){
	    int n=data.length;
	    data1=new Vnode[n];
	    this.data=data;
		for(int i=0;i<data.length;i++){
		     this.data1[i]=data[i];
		}
	}
	//插入排序
	public void insertSort(){//直接插入排序
		 this.data=refelsh();
         for(int i=1;i<data.length;i++){
        	 if((data[i].Chinese>data[i-1].Chinese)||//名字按字典升序
        			 ((data[i].Chinese==data[i-1].Chinese)&&(data[i].name.compareTo(data[i-1].name)<0))){
        		 Vnode temp=data[i];
        		 System.out.print(data[i].name+" ");//測試計算過程
        		 int j=0;
        		 for(j=i-1;j>=0&&((temp.Chinese>data[j].Chinese)||
    					 ((temp.Chinese==data[j].Chinese)&&(temp.name.compareTo(data[j].name)<0)));j--){
        			      data[j+1]=data[j];
        		 }
        		 data[j+1]=temp;    		 
        	 }
         }
         System.out.println();
         showdata(data);
   }
   public void shellSort(){//希爾排序
	    this.data=refelsh();
	    int i,j,d;//d爲增量
	    int num=data.length/3;//增量的起始值爲總長度的1/3
	    for(int m=num;m>0;m--){
	    	d=m;
	    	for(i=d;i<data.length;i++){
	    		 if((data[i].Chinese>data[i-d].Chinese)){
	    			  Vnode temp=data[i];
	    			  System.out.print(data[i].name+" ");//測試計算過程
	    			  for(j=i;j>=d&&(data[j].Chinese>data[j-d].Chinese);j=j-d){
	    	         	     data[j]=data[j-d];
	    			  }
	    			  data[j]=temp;
	    		 }
	    	}
	    }
	    System.out.println();
        showdata(data);
   }
   //選擇排序
   public void selectSort(){//直接選擇排序
	    this.data=refelsh();
	    int k,temp;
	    for(int i=0;i<data.length-1;i++){
	    	k=i;
	    	for(int j=i+1;j<data.length;j++){
	    		if(data[j].Math>data[k].Math)
	    			k=j;
	    	}
	    	System.out.print(data[k].name+" ");
	    	if(k!=i){
	    		temp=data[i].Math;
	    		data[i].Math=data[k].Math;
	    		data[k].Math=temp;
	    	}
	    }
	    System.out.println();
        showdata(data);
   }
   public void heapSort(){//堆排序
	   this.data=refelsh();
	   heap(data,0,data.length-1);
	   showdata(data);    
   }
   public static void heap(Vnode[] data,int low,int high){
			int i;
			Vnode top;
	        int N=data.length-1;
	        for(i=N/2;i>=0;i--){//創建初始堆
	             siftdown(data,i,N);
	        }
	        for(i=0;i<=N;i++)
				System.out.print(i!=N?data[i].name+" ":data[i].name);	
	        System.out.println();
	        for(i=N;i>0;i--){
	        	//取出堆頂元素放在數組的最後面,數組最後的數放在堆頂再向下調整,數組的0位置不用來存儲堆數據,用來交換數據的時候暫存數據
	             top=data[0];
	             data[0]=data[i];
	             data[i]=top;       
	             siftdown(data,0,i-1);
	        }

	}
	public static void siftdown(Vnode[] data,int low,int high){
	    	int k=low;
	    	int j=2*k+1;
	    	Vnode temp=data[k];
	    	while(j<=high){
	    		 //判斷右子節點是否存在,並比較左右節點的大小,和最大的交換
	    		 if((j<high)&&(j+1<=high)&&(data[j].Math>data[j+1].Math)) 
	    			 ++j;
	    		 if(temp.Math>data[j].Math){//調整完之後繼續向下調整
	    			  data[k]=data[j];
	    			  k=j;
	    			  j=2*k+1;
	    		 }else{
	    			 break;
	    		 }
	    	}
	    	data[k]=temp;//找到該點的合適位置
	 }
   //選擇排序
   public void bubbleSort(){//冒泡排序
	   this.data=refelsh();
	   boolean exchange;
	   Vnode tmp;
	   int n=data.length;
	   for(int i=1;i<n;i++){
		   exchange=false;
		   for(int j=0;j<n-i;j++){
			   if(data[j].English<data[j+1].English){
				  tmp=data[j+1];
				  data[j+1]=data[j];
				  data[j]=tmp;
				  exchange=true;
			   }  
		   }
		   System.out.print(data[n-i].name+" ");
		   if(exchange==false)//當不發生交換式視爲數據排序完畢無需繼續向下遍歷
			    break;
	   }
	   System.out.println();
       showdata(data);
   }
   public void quickSort(){//快速排序
	   this.data=refelsh();
	   QSort(data,0,data.length-1);
	   System.out.println();
	   showdata(data);
   }
   public void QSort(Vnode[] R,int low,int high){
	    Vnode base=R[low];    
		int i=low+1;
		int j=high;
		Vnode temp;
		while(i<j){
			while((i<j)&&(R[j].English<=base.English))
				--j;
			while((i<j)&&(R[i].English>=base.English))
				++i;
			
			if(i<j){
				temp=R[i];
				R[i]=R[j];
				R[j]=temp;
			}
		}
		if(i==low+1&&R[i].English<R[low].English){
			   i=low;
			   j=low;
		}
		if(R[j].English>=R[low].English){
			temp=R[low];
			R[low]=R[j];
			R[j]=temp;
		}
		System.out.print(base.name+" ");		
		if(i-low>1)
			QSort(R,low,i-1);
		if(high-j>1)
			QSort(R,j+1,high);
   }
   //歸併排序
   public void mergeSort(){//二路歸併排序
	   this.data=refelsh();
	   int k=1;
	   while(k<data.length){
		   MSort(data,k);
		      k*=2;
	   }
	   System.out.println();
	   showdata(data);
   }
   public void MSort(Vnode[] data,int len){
	   int m=0,l1=0,l2,h1,h2,i=0,j=0;//第一二組開始和結束位置
	   Vnode[] tmp=new Vnode[data.length];//臨時存儲排序的數據
	   while(l1+len<data.length){//最後不能分出一組退出
		   l2=l1+len;
		   h1=l2-1;
		   h2=(l2+len-1<data.length)?l2+len-1:data.length-1;
		   j=l2;
		   i=l1;
		   while((i<=h1)&&(j<=h2)){//兩小組比較存儲
			   if(data[i].sum>=data[j].sum) tmp[m++]=data[i++];
			   else tmp[m++]=data[j++];
		   }
		   while(i<=h1)  tmp[m++]=data[i++];//有一組還有剩餘的情況
		   while(j<=h2)  tmp[m++]=data[j++];
		   l1=h2+1;
	   }
	   i=l1;
	   while(i<data.length)  tmp[m++]=data[i++];//剩下沒有分組也沒排序的直接存在數組後面
	   for(i=0;i<data.length;i++) data[i]=tmp[i]; 
	   if(len==1){
		   for(int t=0;t<data.length;t++)
				  System.out.print(data[t].sum+" ");
	   }
   }
   //基數排序
   public void radixSort(){
	  this.data=refelsh();
	  int k,l,power=1;
	  RadixNode p,q;
	  RadixNode[] head=new RadixNode[10];//順序鏈表
	  Vnode max=new Vnode();
	  max.sum=data[0].sum;
	  for(int i=1;i<data.length;i++){//找出數組中最大的數據
		  if(data[i].sum>max.sum){
			  max.sum=data[i].sum;
		  }
	  }
	  int d=0;
	  while(max.sum>0){//確定最大數字有多少位,決定分配排序次數
		  max.sum/=10;
		  d++;
	  }
	  for(int i=0;i<d;i++){
		  if(i==0)
			  power=1;
		  else
			  power*=10;//每次循環去不同的位作爲分組指標
		  for(int j=0;j<10;j++){//創建實例對象
			  head[j]=new RadixNode();
		  }
		  for(int j=0;j<data.length;j++){
			  k=data[j].sum/power-(data[j].sum/(power*10))*10;//取位第一次個位 第二次十位。。。。
			  q=new RadixNode();
			  q.data=data[j];//把data中的數據按位分組
			  q.next=null;
			  p=head[k].next;
			  if(p==null)
				  head[k].next=q;
			  else{
				  while(p.next!=null)
					  p=p.next;
				  p.next=q;
			  }	  
		  }
		  l=0;
		  for(int j=9;j>=0;j--){//把數據收集到data,每次收集一個head中, 位相同的數總是在連續的一塊
			  p=head[j].next;//比如40 45 第一次 :。45。。。40 。 第二次: 。。45 40 。。。。 
			  while(p!=null){
				  data[l++]=p.data;
				  p=p.next;
			  }
		  }	
		  if(i==0) 
			  for(int t=0;t<data.length;t++)
				   System.out.print(data[t].sum+" ");
	  }
	  System.out.println();
	  showdata(data); 
   }
   static class RadixNode{
	   public Vnode data;
	   public RadixNode next;
   }
   
   
   
   public Vnode[] refelsh(){//把數組數據還原
	   for(int i=0;i<data.length;i++){
		     data[i]=data1[i];
	   }
	   return data;
   }
   public void showdata(Vnode[] data){
		System.out.println("姓名      中文     數學      英語       總分");
		 for(int i=0;i<data.length;i++){
			 System.out.println(data[i].name+"  "+data[i].Chinese+"  "+data[i].Math+"  "+data[i].English+"  "+data[i].sum);
		 }
   }

}

數據結構類

public class Vnode {//排序對象  學生語數外成績以及總分
	public int Chinese=0;
	public int Math=0;
	public int English=0;
	public int sum=0;
	public String name=null;
}

本例利用文件讀取數據所在在工程根目錄加入數據的txt文件 用時第一行要空出來
ab 91 105 113
cd 95 103 114
bc 95 102 115
gh 93 106 112
ef 92 104 111
ce 92 104 111
de 96 101 116
jk 99 110 120
fg 97 107 118
op 98 103 114
xj 50 100 100
xh 51 100 101

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章