第三周作业——冒泡排序和归并排序

本文探讨了冒泡排序和归并排序算法在文件数据排序中的应用,并通过实验比较了它们的时间性能。实验使用了字符读取、转换、排序算法实现及时间计算,最终展示了排序过程和性能差异。

1. 排序。对文件 largeW.txt下载链接)中的数据,编程实现冒泡排序(方法名:bubbleSort) 与 归并排序(mergeSort)

package dierci;
import java.io.*;

public class Suan {
	static int az[]=new int[1110969];
	static int ax=0;
	static int ar[]=new int[1110969];
	static int ar1[]=new int[1110969];
	static int leng=1110968;
	static int lin=0;
	static int lag=0;
//---------------字符读取、转换---------------
	public static void readFileByChars(String fileName) {
		File file = new File(fileName);
		Reader reader = null;
		int y=0;
		try {
		      System.out.println("以字符为单位读取文件,一次读一个字符");
		       // 一次读一个字符
		      reader = new InputStreamReader(new FileInputStream(file));
		      int tempchar,sum=0;
		       while ((tempchar = reader.read()) != -1) {
		      if (((char) tempchar) != '\r') {
		         switch(tempchar){
		         case 48: 
		        	 y=y*10+0;
		        	 break;
		         case 49:
		        	 y=y*10+1;
		        	 break;
		         case 50:
		        	 y=y*10+2;
		        	 break;
		         case 51:
		        	 y=y*10+3;
		        	 break;
		         case 52:
		        	 y=y*10+4;
		        	 break;
		         case 53:
		        	 y=y*10+5;
		        	 break;
		         case 54:
		        	 y=y*10+6;
		        	 break;
		         case 55:
		        	 y=y*10+7;
		        	 break;
		         case 56:
		        	 y=y*10+8;
		        	 break;
		         case 57:
		        	 y=y*10+9;
		        	 break;
		        default:
		        	 {
		        		 sum=sum+1;
		        		 az[ax]=y;
		        		 ar[ax]=y;
		        		 ax=ax+1;
		        		 y=0;
		        	 }
		         }
		       }
		}
		  reader.close();
		System.out.println("ok!");
		System.out.println(sum);
		} catch (Exception e) {
		e.printStackTrace();
		}
	}

//----------------冒泡排序算法-----------------------	
	public static void bubbleSort(int r[],int n){  
		int exchange=n,ang;
		while(exchange!=0){
			int bound=exchange;
			exchange=0;
			
			for(int j=0;j<bound;j++){
				if(r[j]>r[j+1]){
					ang=r[j];
					r[j]=r[j+1];
					r[j+1]=ang;
					exchange=j;
				}
			}
		}
	}
//-------------冒泡排序算法结束--------------
	
	
//----------------归并排序算法-------------------
	public static void Merge(int r[],int r1[],int s,int m,int t){
		int i=0,j=0,k=0;
		i=s;j=m+1;k=s;
		while(i<=m && j<=t){
			if(r[i]<=r[j]){ 
				r1[k]=r[i];
				k=k+1;i=i+1;
			}
			else{
				r1[k]=r[j];
				k=k+1;j=j+1;
			}
		}
		if(i<=m) while(i<=m){
			r1[k]=r[i];
			k=k+1;i=i+1;
		}
		else while(j<=t)
		{
			r1[k]=r[j];
			k=k+1;j=j+1;
		}
	}
	
	public static void MergeSort(int r[],int r1[],int s,int t){
		int m=0;
		lag=lag+1;
		if(s==t) r1[s]=r[s];
		else {
			m=(s+t)/2;
			MergeSort(r,r1,s,m);
			MergeSort(r,r1,m+1,t);
			Merge(r1,r,s,m,t);
		}
	}
	
	public static void MergePass(int r[],int r1[],int n,int h){
		int i=1;
		while(i<=n-2*h+1)
		{
			Merge(r,r1,i,i+h-1,i+2*h-1);
			i+=2*h;
		}
		if(i<n-h-1) Merge(r,r1,i,i+h-1,n);
		else 
			for(int k=i;k<=n;k++)
				r1[k]=r[k];
	}
	public static void MergeSort1(int r[],int r1[],int n){
		int h=1;
		while(h<n){
			MergePass(r,r1,n,h);
			h=2*h;
			MergePass(r1,r,n,h);
			h=2*h;
		}
	}
	
	public static int[] sort(int[] nums, int low, int high) {  
	    int mid = (low + high) / 2;  
	    if (low < high) {  
	        // 左边  
	        sort(nums, low, mid);  
	        // 右边  
	        sort(nums, mid + 1, high);  
	        // 左右归并  
	        merge(nums, low, mid, high);  
	    }  
	    return nums;  
	}  

	public static void merge(int[] nums, int low, int mid, int high) {  
	    int[] temp = new int[high - low + 1];  
	    int i = low;// 左指针  
	    int j = mid + 1;// 右指针  
	    int k = 0;  

	    // 把较小的数先移到新数组中  
	    while (i <= mid && j <= high) {  
	        if (nums[i] < nums[j]) {  
	            temp[k++] = nums[i++];  
	        } else {  
	            temp[k++] = nums[j++];  
	        }  
	    }  

	    while (i <= mid) {  
	        temp[k++] = nums[i++];  
	    }  

	    while (j <= high) {  
	        temp[k++] = nums[j++];  
	    }  

	    for (int k2 = 0; k2 < temp.length; k2++) {  
	        nums[k2 + low] = temp[k2];  
	    }  
	}
//----------------归并排序结束-------------------
	
	
//-----------------时间计算--------------------
	public static void totest(){
		long startTime=System.currentTimeMillis();   //获取开始时间   
		 System.out.println("归并排序开始.....");
		  while(true){
		   
		   //测试的代码段 
		  //bubbleSort(az,leng);
		  //MergeSort1(ar,ar1,leng);
	      sort(az,0,leng);
		  System.out.println("归并排序结束!");
		  long endTime=System.currentTimeMillis(); //获取结束时间   
		  System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
		  System.out.println("递归调用MergeSort()的次数为:"+lag);
		  break;
		  }  
		  for(int u=0;u<300;u++)
		  {
			  //System.out.println(ar1[u]);
		  }
	}
//--------------时间计算结束---------------------
	
	public static void main(String[] args){
		   readFileByChars("G:\\largeW.txt");
		   totest();
		
	}
}



冒泡排序截图:


归并排序尚未成功,暂缺!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值