
算法
听友
这个作者很懒,什么都没留下…
展开
-
冒泡排序、插入排序、选择排序
//冒泡排序public static void bubbleSort(int[] arr,int n){ if(n<=1) return; for(int i = 0;i<n;i++){ boolean flag = false; for(int j = 0;j<n-i-1;j++){ if(arr[j] > arr[j+1]){ int tmp = arr[j];原创 2020-07-26 11:00:19 · 212 阅读 · 0 评论 -
如何实现大整数相加?
public class BigNumberSum { public static String bigNumberSum(String bigNumberA,String bigNumberB){ int maxLength = bigNumberA.length() > bigNumberB.length() ? bigNumberA.length() : bigNumberB.length(); int[] arrayA = new int[maxLe原创 2020-05-25 13:38:28 · 259 阅读 · 0 评论 -
寻找全排列的下一个数
题目:给出一个正整数,找出这个正整数所有数字全排列的下一个数。说通俗点就是在一个整数所包含数字的全部组合中,找到一个大于且仅大于原数的新整数,举几个栗子:如果输入12345,则返回12354。如果输入12354,则返回12435。如果输入12435,则返回12453。思路:固定的几个数组,在逆序排列的情况下最大,在顺序排列的情况下最小。为了和原数接近,需要尽量保持高位不变,低位在最小的范围内变换顺序。变换顺序的范围大小,则取决于当前整数的逆序区域。获得全排列下一个数的3个步骤:1.从.原创 2020-05-24 17:17:46 · 326 阅读 · 1 评论 -
如何用栈实现队列?
题目:用栈来模拟一个队列,要求实现队列的两个基本操作:入队、出队。public class StackQueue { private Stack<Integer> stackA = new Stack<>(); private Stack<Integer> stackB = new Stack<>(); /** * 入队 * @param element */ public void e.原创 2020-05-24 14:14:43 · 373 阅读 · 0 评论 -
如何求出最大公约数?
写一段代码,求出两个整数的最大公约数,尽量优化算法的性能。(1)暴力枚举:从较小整数的一半开始,试图找到一个合适的整数 i,看看这个整数能否被 a 和 b 同时整除。public static int getGreatestCommonDivisor(int a,int b){ int big = a > b ? a : b; int small = a < b ? a :b; if(big%small == 0){ return small;.原创 2020-05-20 00:36:54 · 633 阅读 · 0 评论 -
最小栈的实现
实现一个栈,该栈带有出栈(pop)、入栈(push)、取最小元素(getMin)3个方法。要保证这3个方法的时间复杂度都是O(1)。入栈、出栈场景都应考虑到。解题思路:1.设原有的栈叫做栈A,此时创建一个额外的 “备胎” 栈B,用于辅助栈A。2.当第1个元素进入栈A时,让新元素也进入栈B。这个唯一的元素是栈A的当前最小值。3.之后,每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素进入栈B,此时栈B的栈顶元素就是栈A当前最小值。4.每当栈A有元素出.原创 2020-05-19 23:09:58 · 207 阅读 · 0 评论 -
如何判断链表有环?
一个单向链表,链表中可能出现 “环”,就像下图这样。如何用程序判断该链表是否为有环链表呢?解题思路:有一个很巧妙的方法,这个方法利用了两个指针。创建两个指针p1和p2(在Java里就是两个对象引用),让他们同时指向这个链表的头结点。然后开始一个大循环,在循环体中,让指针p1每次向后移动1个节点,让指针p2每次向后移动2个节点,然后比较两个指针指向的节点是否相同。如果相同,则判断链表有环,如果不同,则继续下一循环。假设链表的节点数量是n,则该算法的时间复杂度是O(n)。除两个结点外,没有使用任何.原创 2020-05-19 21:39:45 · 174 阅读 · 0 评论 -
桶排序算法
桶排序需要创建若干个桶来协助排序。桶的区间范围:区间跨度=(最大值-最小值)/(桶的数量-1)桶排序的总体时间复杂度是O(n),空间复杂度也是O(n)。public class BucketSort { public static double[] bucketSort(double[] array){ //1.得到数列的最大值和最小值,并算出差值d double max = array[0]; double min = array[0原创 2020-05-19 21:00:43 · 413 阅读 · 0 评论 -
计数排序算法
利用数组下标来确定元素元素的正确位置,适用于一定范围内的整数排序。如果原始数列的规模是n,最大和最小整数的差值是m,则计数排序的时间复杂度是O(n+m),空间复杂度是O(m)。public class CountSort { public static int[] countSort(int[] array){ //1.得到数列的最大值和最小值,并算出差值d int max = array[0]; int min = array[0];原创 2020-05-19 20:42:44 · 280 阅读 · 0 评论 -
堆排序算法
堆的自我调整:以最大堆为例,如果删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我调整,第2大的元素就会被交换上来,成为最大堆的新堆顶。二叉堆实际存储在数组中,可以归纳出堆排序算法的步骤:把无序数组构建成二叉堆。需要从小到大排,则构建最大堆;需要从大到小排,则构建最小堆。循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。public class HeapSort { /** * "下沉"调整 * @param array 待调整的堆原创 2020-05-18 22:28:07 · 200 阅读 · 0 评论 -
快速排序(非递归)
绝大多数的递归逻辑,都可以用栈的方式来代替。每次进入一个新方法,就相当于入栈,每次有方法返回,就相当于出栈。public class Sort { public static void QuickSort(int[] arr,int startIndex,int endIndex){ // 用一个集合栈来代替递归的函数栈 Stack<Map<String,Integer>> quickSortStack = new Stack&l原创 2020-05-18 21:28:12 · 206 阅读 · 0 评论 -
快速排序(递归)
快排之所以快,是因为采用了分治法,在每一轮挑选一个基准元素,并让其他比它大的元素移到数动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成两个部分。快排的平均时间复杂度是O(nlogn),但在极端情况下(数列的第一个元素为最小值或最大值),时间复杂度为O(n2n^2n2)。快排有两种方法:双边循环法、单边循环法。双边循环法是选定基准元素pivot,并设置两个指针left、right,指向数列的最左和最右两个元素。先从 right 指针开始,让指针指向的元素与基准元素比较,如果大于或等于pi原创 2020-05-18 18:25:43 · 2929 阅读 · 0 评论 -
鸡尾酒排序算法
鸡尾酒排序是基于冒泡排序的一种升级排序法,冒泡排序是从左到右来比较元素,进行单向的位置交换的,鸡尾酒排序的元素和交换是双向的,一轮从左到右比较,一轮从右到左比较。代码外层的大循环控制着所有排序回合,大循环内包含2个小循环,第1个小循环从左向右比较并交换元素,第2个小循环从右向左比较并交换元素。鸡尾酒排序的优点是能够在特定条件下,减少排序的回合数,缺点就是代码量几乎增加了一倍,它能发挥优势的场景是大部分元素已经有序的情况。public static void sort(int[] array){ in原创 2020-05-16 13:25:41 · 364 阅读 · 0 评论 -
冒泡排序Bubble Sort算法最优解
public class BubbleSort { public static void main(String[] args) { int[] array = {3,4,2,1,5,6,7,8}; sort(array); System.out.println(Arrays.toString(array)); } public static void sort(int[] array){ //记录最后一次交换的位置原创 2020-05-16 10:46:29 · 664 阅读 · 1 评论