2000做网站贵么,郑州网站建设冫汉狮网络,龙南建设局网站,重庆潼南网站建设报价1.冒泡排序1.1 基本概念冒泡排序#xff08;Bubble Sort#xff09;是一种简单的排序算法#xff0c;它重复地遍历要排序的数列#xff0c;一次比较两个元素#xff0c;如果它们的顺序错误就把它们交换过来。这个算法的名称由来是因为越小的元素会经由交换慢慢浮Bubble Sort是一种简单的排序算法它重复地遍历要排序的数列一次比较两个元素如果它们的顺序错误就把它们交换过来。这个算法的名称由来是因为越小的元素会经由交换慢慢浮到数列的顶端升序排列。1.2 算法步骤比较相邻元素从数组的第一个元素开始比较相邻的两个元素交换位置如果第一个元素比第二个元素大升序排列时就交换它们的位置重复遍历对每一对相邻元素做同样的工作从开始第一对到结尾的最后一对。这步做完后最后的元素会是最大的数缩小范围针对所有的元素重复以上的步骤除了最后一个持续进行持续每次对越来越少的元素重复上面的步骤直到没有任何一对数字需要比较1.3 时间复杂度分析最好情况当输入的数据已经是正序时时间复杂度为O(n)最坏情况当输入的数据是反序时时间复杂度为O(n²)平均情况时间复杂度为O(n²)1.4 空间复杂度冒泡排序的空间复杂度为O(1)因为它只需要一个额外的空间用于交换元素。1.5 代码示例java实现package com.heima; import java.util.Arrays; /** * 冒泡排序 */ public class BubbleSort { public static void bubbleSort(int[] arr) { for(int j0;j arr.length;j){ for (int i 0;i arr.length-1;i){ if (arr[i] arr[i1]) { int temp arr[i]; arr[i]arr[i1]; arr[i1]temp; } } } } public static void main(String[] args) { int[] arr { 49, 38, 65, 97, 76, 13, 27, 1 }; bubbleSort(arr); System.out.println(Arrays.toString(arr)); } }2.快速排序2.1 递归算法递归算法是一种通过函数调用自身来解决问题的编程方法。其核心思想是将一个大问题分解为若干个结构相似的小问题直到达到可以直接求解的基准情形base case。递归算法通常包含两个关键部分递归条件Recursive Case定义如何将问题分解为更小的子问题基准条件Base Case定义可以直接求解的最简单情形防止无限递递归算法需要注意必须确保递归最终能到达基准条件需要考虑栈空间限制防止栈溢出对于重复计算问题如斐波那契数列可以使用记忆化技术优化递归与迭代的比较递归代码通常更简洁直观迭代通常效率更高且不消耗额外栈空间某些问题如树遍历用递归实现更自然2.1.1 斐波那契数列public static int sort(int n){ if(n1){ return 1; }else if(n2){ return 1; }else{ return sort(n-1)sort(n-2); } }2.2 快速排序Quick Sort快速排序是一种高效的排序算法采用分治策略Divide and Conquer进行排序。其核心思想是通过一次排序将待排序的数据分割成独立的两部分其中一部分的所有数据都比另一部分的数据小然后再递归地对这两部分数据进行排序。2.2.1 算法步骤选取数组第一个元素作为基准数初始化i和j分别指向数组首尾两端j游标从右向左移动寻找比基准数小的元素找到后停止i游标从左向右移动寻找比基准数大的元素找到后停止检查i和j是否相遇若未相遇交换i和j指向的元素重复步骤2-4当i和j相遇时交换相遇位置的元素与基准数以基准数为界将数组划分为左右两个子数组递归地对子数组重复上述步骤直到无法继续划分为止2.2.2 示例代码java实现,使用递归进行书写package com.heima; import java.util.Arrays; public class Demo { public static void sort(int arr[],int left,int right){ if(left right) return; int base arr[left]; int i left; int j right; while(i j){ while(arr[j] base ij){ j--; } while(arr[i] base ij){ i; } int temp arr[i]; arr[i] arr[j]; arr[j] temp; } arr[left] arr[i]; arr[i] base; sort(arr,left,i-1); sort(arr,i1,right); } public static void main(String[] args) { int arr[] {5,4,3,2,1}; sort(arr,0,arr.length-1); System.out.println(Arrays.toString(arr)); } }2.2.3 时间复杂度最优情况每次分区都能将数组均匀分成两部分时间复杂度为 (O(n \log n))。最坏情况每次分区都极不均匀例如数组已经有序或逆序时间复杂度为 (O(n^2))。平均情况时间复杂度为 (O(n \log n))。2.2.4 空间复杂度快速排序是原地排序算法空间复杂度主要取决于递归调用的深度。最优情况下为 (O(\log n))最坏情况下为 (O(n))。2.2.5 应用场景适用于大规模数据的排序尤其是在内存有限的情况下。常用于编程语言内置的排序函数如Python的list.sort()和sorted()函数。2.2.6 优缺点优点平均性能优异适合大多数场景。原地排序节省内存。缺点最坏情况下性能较差。递归实现可能导致栈溢出可通过尾递归优化或迭代方式解决。3. 堆排序堆排序Heap Sort是一种基于二叉堆Binary Heap数据结构的比较排序算法。它利用堆这种特殊的数据结构来实现高效的排序具有稳定且良好的时间复杂度。3.1 算法原理堆排序的基本思想是将待排序的序列构造成一个大顶堆或小顶堆此时整个序列的最大值或最小值就是堆顶的根节点。将其与末尾元素进行交换此时末尾就为最大值。然后将剩余n-1个序列重新构造成一个堆这样会得到n个元素的次大值。如此反复执行便能得到一个有序序列。关键步骤构建堆Heapify将无序序列构建成一个堆根据升序或降序需求选择大顶堆或小顶堆。大顶堆每个节点的值都大于或等于其子节点的值用于升序排序小顶堆每个节点的值都小于或等于其子节点的值用于降序排序调整堆将堆顶元素与末尾元素交换缩小堆的范围并重新调整堆结构重复调整重复步骤2直到整个序列有序3.2 算法实现堆排序的实现主要包含两个核心操作sort(int arr[],int parent,int length)创建大顶堆main调用sort函数创建大顶堆使用循环经行堆排序package com.heima; import java.util.Arrays; public class Duisort { public static void sort(int arr[],int parent,int length){ int child 2*parent1; while(childlength){ int rchildchild1; if(rchildlengtharr[rchild]arr[child]){ child; } if(arr[parent]arr[child]){ int temp arr[parent]; arr[parent]arr[child]; arr[child]temp; parent child; child2*parent1; }else{ break; } } } public static void main(String[] args) { int arr[] {1,3,2,5,4,6,7,8,9,10}; int length arr.length; //创建堆 for(int plength-1;p0;p--){ sort(arr,p,length); } //堆排序 for(int ilength-1;i0;i--){ int temp arr[0]; arr[0]arr[i]; arr[i]temp; sort(arr,0,i); } System.out.println(Arrays.toString(arr)); } }3.3 复杂度分析时间复杂度建堆过程O(n)每次调整堆O(log n)总体O(n log n)最好、最坏和平均情况都是如此空间复杂度O(1)原地排序3.4 特点与应用优点时间复杂度稳定在O(n log n)不需要额外的存储空间原地排序适用于大数据量的排序缺点不稳定排序相同元素的相对位置可能改变在数据量较小时可能不如插入排序高效缓存局部性较差频繁的远距离元素交换3.5 与其他排序算法的比较vs 快速排序堆排序最坏情况也是O(n log n)而快排最坏是O(n²)但快排的常数因子通常更小实践中往往更快快排是稳定排序堆排序不稳定堆排序虽然在实际应用中不如快速排序使用广泛但其稳定的时间复杂度使其在某些特定场景如实时系统、内存受限环境中具有独特优势。理解堆排序不仅有助于掌握重要的数据结构知识堆也是学习其他基于堆的算法如Dijkstra算法、优先级队列等的基础。