插入法排序|冒泡发排序|快速排序法|选择排序法 四种排序法的效率

           这里先声明一下,我只做了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]+",");
		}
	}
	
}




         




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值