排序算法效率比較 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=================*/

}

	

 

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