快排、堆排序、插入法比较
2017-11-28 09:50
99 查看
快排和插入法网上有介绍,堆排序还没搞懂,简单的测试了下,实际中,快排的性能最好。
后续把堆排序搞懂后在写个文档便于复习。
————————————————————————————————————————————————————————
2017/11/28 测试例子,百万级别的用例,插入法时间性能是在太差。数组大小可以自己设置。
结果如下:
快排时间25ms
堆排时间34ms
插入法时间6500ms
算法排序结果一致
多次测量,时间有波动,原因是根据随机生成的数组(绝大原因)。
后续把堆排序搞懂后在写个文档便于复习。
————————————————————————————————————————————————————————
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
算法排序结果一致
多次测量,时间有波动,原因是根据随机生成的数组(绝大原因)。
相关文章推荐
- 快速排序、堆排序、归并排序比较
- 堆排序 合并排序 快速排序 简单比较
- 快速排序、堆排序、归并排序简单比较
- 几种常见的排序算法,选择排序,冒泡排序,希尔排序,堆排序,快速排序,归并排序,基数排序的比较
- 归并排序,堆排序,基数排序,希尔排序,快速排序,交换排序,选择排序和插入排序的总结和比较
- 学习笔记--- 比较排序之堆排序
- 比较排序总结——直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序
- 对c语言系统库函数、堆排序、希尔排序、折半插入排序、快速排序消耗时间的比较
- 9种排序算法性能之比较之----堆排序
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较
- 堆排序中两种建堆方法的比较
- 基于比较的算法之五:堆排序
- leecode 169. Majority Element(C语言,快速排序,堆排序,各类排序算法复杂度比较)22
- 快速排序-堆排序-STL中的堆排序-归并排序 》时间比较
- 堆排序和选择排序的比较
- 【更新】排序算法比较:插入排序,冒泡排序,归并排序,堆排序,快速排序,计数排序,基数排序,桶排序
- 比较排序之堆排序和快速排序
- 堆排序、快速排序(递归与非递归)、归并排序效率比较
- 快速排序、堆排序、归并排序比较
- 海量数据取中位数,比较简单耗时的是用堆排序