排序算法效率比较 java

实训目的:数组、Java API的应用

实训要求:随机生成10000个10000以内的实数,分别用选择、冒泡、快速排序等算法进行排序,计算各种排序所需时间并比较算法的效率。

 

代码:



import java.util.Random;

public class Paixu 
{
	public static void main(String[] args) 
	{
	
/*===============冒泡排序a=================*/
	int a[]=new int[10000];
	int temp;	
	Random r = new Random();
	for(int i=0;i<a.length;i++)//chu_yu_xuan
		{
			a[i] = r.nextInt(10000);
		}	
long startTime = System.currentTimeMillis();
	for(int i=0;i<a.length-1;i++)
	{
		for(int j=0;j<a.length-i-1;j++)
		{
			if(a[j+1]<a[j])
			{
			  temp = a[j];
			  a[j] = a[j+1];
			  a[j+1] = temp;
			}			
		}	 		
	}
long endTime = System.currentTimeMillis();
System.out.println("冒泡排序运行时间:" + (endTime - startTime) + "ms");

/*===============冒泡排序b=================*/

/*===============选择排序a=================*/
	int b[]=new int[10000];
	Random e = new Random();
	for(int i=0;i<b.length;i++)
		{
		b[i] = e.nextInt(10000);
		}
long startTime1 = System.currentTimeMillis();
	for(int i = 0; i < b.length - 1; i++) 
	{// 做第i趟排序
        int k = i;
        for(int j = k + 1; j < b.length; j++)
        {// 选最小的记录
             if(b[j] < b[k])
             { 
                 k = j; //记下目前找到的最小值所在的位置
             }
         }
         //在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
         if(i != k)
         {  //交换a[i]和a[k]
             int temp21 = b[i];
             b[i] = b[k];
             b[k] = temp21;
         }          
     }
long endTime1 = System.currentTimeMillis();
System.out.println("选择排序运行时间:" + (endTime1 - startTime1) + "ms");
/*===============选择排序b=================*/
	
/*===============快速排序a=================*/	
	int c[]=new int[10000];
    Random f = new Random();
    for(int i=0;i<c.length;i++)
    	{
    		c[i] = f.nextInt(10000);
    	}
    int start = 0;
    int end = c.length-1;
    long startTime11 = System.currentTimeMillis();   
    sort(c,start,end);
    long endTime11 = System.currentTimeMillis();
    System.out.println("快速排序运行时间:" + (endTime11 - startTime11) + "ms");   
}
	public static void sort(int[] a,int low,int high){
        int start = low;
        int end = high;
        int key = a[low];
        
        
        while(end>start){
            //从后往前比较
            while(end>start&&a[end]>=key)  //如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
                end--;
            if(a[end]<=key){
                int temp = a[end];
                a[end] = a[start];
                a[start] = temp;
            }
            //从前往后比较
            while(end>start&&a[start]<=key)//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
               start++;
            if(a[start]>=key){
                int temp = a[start];
                a[start] = a[end];
                a[end] = temp;
            }
        //此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
        }
        //递归
        if(start>low) sort(a,low,start-1);//左边序列。第一个索引位置到关键值索引-1
        if(end<high) sort(a,end+1,high);//右边序列。从关键值索引+1到最后一个
    }
	
	/*===============快速排序b=================*/

}

	
发布了19 篇原创文章 · 获赞 9 · 访问量 7447

猜你喜欢

转载自blog.csdn.net/Cryu_xuan/article/details/90634367