實訓目的:數組、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=================*/
}