这里先声明一下,我只做了int型数组的排序的测试,至于其他的我不敢妄加判断,所以就不说其他类型的了;还有就是这里的快速排序我是直接从网上找的,所以只能算是自己的一些总结,希望对小白有用。
我在下面上传了图片,更具length长度的不同,得出效率时间,当然我电脑配置不好,cpu还是老牌的奔腾,只能拍这么快!如果时间上有误差这个不稀奇
package test;
public class SortArray {
private static final int Min = 1;//生成随机数最小值
private static final int Max = 10000;//生成随机数最大值
private static final int Length = 40;//生成随机数组长度(测试的朋友建议不要超过40000,不然你要等很久,如果你电脑配置绝对高的情况下你可以再加个0试试)
public static void main(String[] args) {
System.out.println("数组长度:"+Length+", Min:"+Min+", Max:"+Max);
long begin;
long end;
int arr[] = getArray(Length);
begin = System.currentTimeMillis();
insertSort(arr.clone());
end = System.currentTimeMillis();
System.out.println("插入法排序法消耗时间:"+(end-begin)+"毫秒");
begin = System.currentTimeMillis();
bubbleSort(arr.clone());
end = System.currentTimeMillis();
System.out.println("冒泡发排序法消耗时间:"+(end-begin)+"毫秒");
begin = System.currentTimeMillis();
fastSort(arr.clone(),0,arr.length-1);
end = System.currentTimeMillis();
System.out.println("快速排序法消耗时间:"+(end-begin)+"毫秒");
begin = System.currentTimeMillis();
choiceSort(arr.clone());
end = System.currentTimeMillis();
System.out.println("选择排序法消耗时间:"+(end-begin)+"毫秒");
}
/**生成随机数数组
* @param length 数组长度
* @return int[]
*/
private static int[] getArray(int length){
if(length<=0)return null;
int arr[] = new int[length];
for (int i = 0; i < arr.length; i++) {
int temp = (int)(Min+Math.random()*(Max-Min-1));
arr[i] = temp;
}
return arr;
}
/**快速发排序
* @param arr 需要排序的数组
* @param left 数组最小下标(一般是0)
* @param right 数组最大下标(一般是Length-1)
* @return int[]
*/
private static int[] fastSort(int[] arr,int left,int right){
if(left < right){
int s = arr[left];
int i = left;
int j = right + 1;
while(true){
//向右找大于s的元素的索引
while(i+1 < arr.length && arr[++i] < s);
//向左找小于s的元素的索引
while(j-1 > -1 && arr[--j] > s);
//如果i >= j 推出循环
if(i >= j){
break;
}else{
//教化i和j位置的元素
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[left] = arr[j];
arr[j] = s;
//对左面进行递归
fastSort(arr,left,j-1);
//对右面进行递归
fastSort(arr,j+1,right);
}
return arr;
}
/**插入法排序
* @param arr 需要排序的数组
* @return int[]
*/
private static int[] insertSort(int[] arr){
for(int i = 1;i < arr.length;i++){
int temp = arr[i];
int j = i - 1;
while(temp < arr[j]){
arr[j+1] = arr[j];
j--;
if(j == -1){
break;
}
}
arr[j+1] = temp;
}
return arr;
}
/**冒泡发排序
* @param arr 需要排序的数组
* @return int[]
*/
private static int[] bubbleSort(int[] arr){
for(int i = 0;i < arr.length;i++){
//比较两个相邻的元素
for(int j = 0;j < arr.length-i-1;j++){
if(arr[j] > arr[j+1]){
int t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
return arr;
}
/**选择法排序
* @param arr
* @return
*/
private static int[] choiceSort(int[] arr){
for(int i = 0;i < arr.length;i++){
int m = i;
for(int j = i + 1;j < arr.length;j++){
//如果第j个元素比第m个元素小,将j赋值给m
if(arr[j] < arr[m]){
m = j;
}
}
//交换m和i两个元素的位置
if(i != m){
int t = arr[i];
arr[i] = arr[m];
arr[m] = t;
}
}
return arr;
}
/**打印数组
* @param arr 需要打印的数组
*/
private static void print(int[] arr){
if(arr==null||arr.length==0)return;
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+",");
}
}
}