快排、堆排序、插入法比较
来源:互联网 发布:国家网络应急中心考试 编辑:程序博客网 时间: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
算法排序结果一致
多次测量,时间有波动,原因是根据随机生成的数组(绝大原因)。
阅读全文
0 0
- 快排、堆排序、插入法比较
- 排序算法 快排 堆排 选择 插入 希尔 归并
- 插入、希尔、快排、堆排、自然归并排序
- 排序(冒泡,选择,插入,快排,堆排)
- 快排、堆排序
- 排序-归并、快排、插入、堆、希尔排序
- 排序(插入,希尔,选择,堆排序,归并,快排)
- 选择 冒泡 插入 快排 堆排序 排序
- 快排与堆排序、归并排序的比较
- 排序算法:快排,插入,希尔,归并,堆,选择,冒泡
- 插入、冒泡、归并、堆排序、快排总结
- C++DLL导出类(快排,堆排,插入排序,选择排序,冒泡排序)
- 快排和堆排序
- 快排和堆排序
- 排序(快排,冒泡,堆排序,插入排序,归并排序,选择排序)算法Java实现
- 常见的三种排序算法(堆排、快排、归并排序)的比较总结
- 插入排序与快排
- 插入排序与快排
- 单例模式 【宏定义实现】
- java的ArrayList使用方法详解(清晰的讲解)
- [待完成]Android Service的<service>标签
- 如何创建属于自己的Git(一)
- C#中StringBuilder类的使用
- 快排、堆排序、插入法比较
- 命令查看Linux服务器内存、CPU、显卡使用情况
- erlang 编译安装
- CMA debug
- 后缀排序
- Docker的安装
- Spring Boot 入门
- MariaDB设置初始化密码及修改密码
- 最大子段和(分治与动态规划典例)