快排、堆排序、插入法比较

快排和插入法网上有介绍,堆排序还没搞懂,简单的测试了下,实际中,快排的性能最好。

后续把堆排序搞懂后在写个文档便于复习。

————————————————————————————————————————————————————————

2017/11/28   测试例子,百万级别的用例,插入法时间性能是在太差。数组大小可以自己设置。


public class Sort {
    public static void main(String[] args) {

        int[] arr = new int[100000];
        Random r = new Random();
        for (int i = 0; i <100000 ; i++) {
            arr[i] = r.nextInt(1000000000);
        }
        int[] arr1 = arr.clone();
        int[] arr2 = arr.clone();
        //测试快排时间
        long time = System.currentTimeMillis();
        quickSort(arr1,0,arr1.length-1);
        time = System.currentTimeMillis() - time;
        System.out.println("快排时间"+time);

        //测试堆排时间
        time = System.currentTimeMillis();
        heapSort(arr2);
        time = System.currentTimeMillis() - time;
        System.out.println("堆排时间"+time);

        //测试插入法时间
        time = System.currentTimeMillis();
        insertSort(arr);
        time = System.currentTimeMillis() - time;
        System.out.println("插入法时间"+time);



/*        //验证算法是否正确
        int[] arrs = new int[]{56, 18, 6, 3, 97, 66, 8, 26, 88, 30, 99, 93};
        //int[] arrs = new int[]{20,50,20,40,70,10,80,30,60};
        insertSort(arrs);
        quickSort(arrs,0,arrs.length-1);
        heapSort(arrs);
        System.out.println(Arrays.toString(arrs));*/
/*        //验证是否正确
        for (int i = 0; i <100000 ; i++) {
            if(arr[i]!=arr1[i]&&arr1[i]!=arr2[i]){
                System.out.println("数组有不同的地方"+arr[i]+arr1[i]+arr[2]);
                break;
            }
            if(i==arr1.length-1){
                System.out.println("算法排序结果一致");
            }
        }*/
} public static void heapSort( int []arr){ //1. 构建大顶堆 for( int i=arr. length/ 2- 1 ;i>= 0 ;i--){ // 从第一个非叶子结点从下至上,从右至左调整结构 adjustHeap(arr ,i ,arr. length) ; } //2. 调整堆结构 + 交换堆顶元素与末尾元素 for( int j=arr. length- 1 ;j> 0 ;j--){ swap(arr , 0 ,j) ; // 将堆顶元素与末尾元素进行交换 adjustHeap(arr , 0 ,j) ; // 重新对堆进行调整 } } public static void adjustHeap( int []arr ,int i ,int length){ int temp = arr[i] ; // 先取出当前元素 i for( int k=i* 2+ 1 ;k;k=k* 2+ 1){ // i 结点的左子结点开始,也就是 2i+1 处开始 if(k+ 11]){ // 如果左子结点小于右子结点, k 指向右子结点 k++ ; } if(arr[k] >temp){ // 如果子节点大于父节点,将子节点值赋给父节点(不用进行交换) arr[i] = arr[k] ; i = k ; } else{ break; } } arr[i] = temp ; // temp 值放到最终的位置 } public static void swap( int []arr ,int a ,int b){ int temp=arr[a] ; arr[a] = arr[b] ; arr[b] = temp ; } private static void quickSort( int[] arr ,int left ,int right){ if(left>right){ return; } int p = arr[left] ; int i= left ,j=right ; while(iwhile(arr[j]>=p&&i; } while(arr[i]<=p&&i; } if(iint temp = arr[i] ; arr[i] = arr[j] ; arr[j] = temp ; } } arr[left] = arr[i] ; arr[i] = p ; quickSort(arr ,left ,i- 1) ; quickSort(arr ,i+ 1 ,right) ; } private static void insertSort( int[] arr) { if(arr== null || arr. length == 0){ return; } for ( int i = 0 ; i length ; i++) { int temp = arr[i] ; int j = i- 1 ; while(j>= 0&&arr[j]>temp){ arr[j+ 1] = arr[j] ; j-- ; } arr[j+ 1] = temp ; } }}

结果如下:

快排时间25ms
堆排时间34ms
插入法时间6500ms
算法排序结果一致

多次测量,时间有波动,原因是根据随机生成的数组(绝大原因)。

你可能感兴趣的:(快排、堆排序、插入法比较)