排序
lpls1
这个作者很懒,什么都没留下…
展开
-
JAVA快排数组被卡常?试试优先队列(堆排)
对时限一秒的题目采用O(nlogn)的算法,如果写法没问题是不会被T的。但是快排是个例外,如果测试数据被精心安排过,时间复杂度就会接近O(n^2)。因此保险起见,在对初始的无序原创 2022-01-09 17:11:47 · 301 阅读 · 0 评论 -
快速排序(递归实现)
1.哨兵位置为最终位置2.partition就是切分过程3.选择一个哨兵,将一组数划分为全比它小、全比它大的左右两部分,再分别对这两部分继续如此左右划分,直到元素个数为1.整个划分结束时,数组已排好序。4.至于partition过程,参见上图。伪码:void quickSort(int a[],int p,int r){ if(p<r){ int q=partition(a,p,r); quickSort(a,p,q-1); quickSort(a,q+1,r); }}.原创 2020-06-22 09:12:57 · 213 阅读 · 0 评论 -
归并排序(非递归实现)
注意1.在递归实现中,向下划分的过程中并没有实际操作。实际交换位置等merge操作是从底端向上进行的2.因此递归过程可消除,避免不必要的系统开销代码实现:import java.util.Scanner;public class 归并非递归实现 { /** * 归并排序(非递归) * (合并内部已排好序的两两相邻数组)从切分的数组长度为1开始,一次归并变回原来长度的2倍 * @param nums 待排序数组 * @return 排好序的数组 .原创 2020-06-21 16:00:18 · 2192 阅读 · 0 评论 -
归并排序(递归实现)
只是补个欠账…注意:树形结构切分到回复,时间复杂度一般为O(nlogn)递归的归并排序,最大时间复杂度=平均时间复杂度=O(nlogn)递归的归并排序是按照深度优先在树上进行的。伪码描述:MERGE_SORT(A,p,r) //p<r时,至少还有两个数字。 //当元素个数为偶数,即p+r为奇数时,(p+r)/2落在中线之前的那个元素。 if p<r then q<--(p+r)/2 //分解过程 MERGE-SORT(A,p,q) MERGE-SORT(A,q+原创 2020-06-21 12:03:16 · 274 阅读 · 0 评论 -
求区间第k大之——归并树(poj2104)
归并树与线段树的区别是,线段树的结点维护一个值,而归并树的结点维护一个有序数组。每个节点的数列是其两个儿子节点的数列合并后的结果。这颗线段树正是归并排序的完整再现。要计算在某个区间上不大于x的数的个数,只需:如果所给区间与当前区间没有交集,返回0如果所给区间完全包含当前区间,使用二分搜索找出当前区间的不大于x的数的下标再加1,返回这个值否则对两个儿子递归地进行计算之后返回他们的和。由...原创 2019-11-30 14:48:31 · 217 阅读 · 0 评论 -
自定义对象数组根据某一属性值按自定义顺序排序
不需要list、collections.sort等。只需要arrays.sort(数组,start,end)//注意参数不再是只有数组。而且,start包含,end不包含。另外,自定义对象数组的每一个元素都需要单独初始化自定义对象的类需要实现comparable接口中的compareto()方法。poj2431涉及到了这个知识点,AC代码粘贴如下。这道题还有非常多坑。import jav...原创 2019-02-27 20:35:00 · 827 阅读 · 0 评论