冒泡排序与归并排序

         在数据结构和算法中,我们都会学习到各种排序的方法,但不同的方法其运行时间和效率也是有区别的。本文将冒泡排序和归并排序作为对比,观察两种算法的效率。


冒泡排序代码实现:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;

public class bubbleSort {
	public static void main(String []args) throws IOException{		 
		FileInputStream fis=new FileInputStream("E:/largeW.txt");
		InputStreamReader dis=new InputStreamReader(fis);
		BufferedReader reader=new BufferedReader(dis);
		String s =null;
		String []strs =null;
		int []data;
		int count =0;
		List<String> strList = new ArrayList<String>();
		
		while((s=reader.readLine())!=null){
			count++;
			strList.add(s);   
			//向动态数组中添加从文件largeW.txt中读取的数据
		}
			data = new int[strList.size()];			
			for (int i = 0; i < strList.size(); i++) {
				data[i] = Integer.parseInt(strList.get(i).trim());	
				//将strList中的String类型数据转化为int型数据并存放到data数组中			
			}
			long startTime=System.currentTimeMillis(); //获取排序开始时的时间
			for(int j =1;j <data.length;j++){          //冒泡排序
				for(int k =j+1;k <data.length;k++){
					if(data[j] > data[k]){
					int t;
					t =data[j];
					data[j] =data[k];
					data[k] =t;					
				}					
				}				
				//System.out.println(data[j]);				
			}
			long endTime=System.currentTimeMillis();   //获取排序结束后的时间
			OutputStreamWriter outputStream = new OutputStreamWriter(new FileOutputStream("E:/largeW_bubble.txt")); 
			for(int i = 1;i < data.length;i++){				
			     outputStream.write(data[i]+" ");	
			     //将排好序的数组存放到文件largeW_bubble.txt中			 
				 System.out.println(data[i]);
			}
			outputStream.close();
		System.out.println("总共有数据:"+count+"条");
		System.out.println("排序时间为: "+(endTime-startTime)+"ms");
		dis.close();
	}
	
}

冒泡排序时间:


归并排序代码实现:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;

public class mergeSort {
	public static void main(String []args) throws IOException{		 
		FileInputStream fis=new FileInputStream("E:/largeW.txt");
		InputStreamReader dis=new InputStreamReader(fis);
		BufferedReader reader=new BufferedReader(dis);
		String s =null;
		String []strs =null;
		int []data;
		int count =0;
		List<String> strList = new ArrayList<String>();
		while((s=reader.readLine())!=null){
			count++;
			strList.add(s);
		}
			data = new int[strList.size()];			
			for (int i = 0; i < strList.size(); i++) {
				data[i] = Integer.parseInt(strList.get(i).trim());				
			}
			long startTime=System.currentTimeMillis();
			mergeSort(data);
			long endTime=System.currentTimeMillis();
			OutputStreamWriter outputStream = new OutputStreamWriter(new FileOutputStream("E:/largeW_merge.txt"));
	        System.out.println("排序后的数组:");
	        for (int i = 0; i < data.length; i++) { 
	        	outputStream.write(data[i]+" ");
	            System.out.println(data[i]);  
	        }
	        outputStream.close();	       
	        System.out.println("排序时间为: "+(endTime-startTime)+"ms");
	}
	public static void mergeSort(int[] data) {  
        sort(data, 0, data.length - 1);  
    }  
  
    public static void sort(int[] data, int left, int right) {  
        if (left >= right)  
            return;  
        // 找出中间索引  
        int center = (left + right) / 2;  
        // 对左边数组进行递归  
        sort(data, left, center);  
        // 对右边数组进行递归  
        sort(data, center + 1, right);  
        // 合并  
        merge(data, left, center, right);        
    }  
    public static void merge(int[] data, int left, int center, int right) {  
        // 临时数组  
        int[] tmpArr = new int[data.length];  
        // 右数组第一个元素索引  
        int mid = center + 1;  
        // third 记录临时数组的索引  
        int third = left;  
        // 缓存左数组第一个元素的索引  
        int tmp = left;  
        while (left <= center && mid <= right) {  
            // 从两个数组中取出最小的放入临时数组  
            if (data[left] <= data[mid]) {  
                tmpArr[third++] = data[left++];  
            } else {  
                tmpArr[third++] = data[mid++];  
            }  
        }  
        // 剩余部分依次放入临时数组(实际上两个while只会执行其中一个)  
        while (mid <= right) {  
            tmpArr[third++] = data[mid++];  
        }  
        while (left <= center) {  
            tmpArr[third++] = data[left++];  
        }  
        // 将临时数组中的内容拷贝回原数组中  
        // (原left-right范围的内容被复制回原数组)  
        while (tmp <= right) {  
            data[tmp] = tmpArr[tmp++];  
        }  
    }  
}

归并排序时间:


     理论上,冒泡排序的时间复杂度为O(n²),而归并排序的时间复杂度为O(n)。实际运行结果也表明,归并排序的效率要比冒泡排序效率高得多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值