实训目的:数组、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=================*/
}