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

来源:互联网 发布:国家网络应急中心考试 编辑:程序博客网 时间:2024/04/30 05:11

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

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

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

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<length;k=k*2+1){//i结点的左子结点开始,也就是2i+1处开始 if(k+1<length && arr[k]<arr[k+1]){//如果左子结点小于右子结点,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(i<j){ while(arr[j]>=p&&i<j){ j--; } while(arr[i]<=p&&i<j){ i++; } if(i<j){ int 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 <arr.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
算法排序结果一致

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

原创粉丝点击