长沙做网站的有哪些济阳做网站公司
- 作者: 五速梦信息网
- 时间: 2026年04月20日 05:06
当前位置: 首页 > news >正文
长沙做网站的有哪些,济阳做网站公司,宽屏网站设计,烟台seo管理目录 冒泡排序(BubbleSort)#xff1a; 代码详解#xff1a; 冒泡排序的优化#xff1a; 选择排序(SelectSort)#xff1a; 代码详解#xff1a; 插入排序#xff08;InsertSort#xff09;#xff1a; 代码详解#xff1a; 希尔排序(ShellSort)#xff1a; 法一…目录 冒泡排序(BubbleSort) 代码详解 冒泡排序的优化 选择排序(SelectSort) 代码详解 插入排序InsertSort 代码详解 希尔排序(ShellSort) 法一交换法代码详解 法二移位法–插入排序的优化代码详解 快速排序QuickSort 代码详解 归并排序MergetSort 代码详解 基数排序RadixSort 代码详解 最后一张图概括 冒泡排序(BubbleSort) 冒泡排序BubbleSort的基本思路通过对待排序从前往后从下标较小的元素开始依次比较相邻元素的值若发现逆序则交换使值较大的元素逐渐从前往后移动较小的往上挪动就像水底下的气泡一样逐渐向上冒。 图解 代码详解 public class BubbleSort {public static void main(String[] args){Scanner scnew Scanner(System.in);int[] arrnew int[5];//假设测试案例只有五个数字System.out.print(请输入要排序的数组);for(int i0;i5;i){arr[i]sc.nextInt();}bubblesort(arr);System.out.println();System.out.print(请输出排序好的数组Arrays.toString(arr));}public static void bubblesort(int[] arr){for(int i0;iarr.length-1;i){for(int j0;jarr.length-1-i;j){if(arr[j]arr[j1]){int temparr[j];arr[j]arr[j1];arr[j1]temp;}}System.out.printf(第%d趟排序后的数组,i1);//展示每次冒泡排序的过程System.out.println(Arrays.toString(arr));//将数组转化为字符串的形式输出}} }运行结果通过运行结果来展示“气泡”向上挪动的过程较大的数逐渐沉底 冒泡排序的优化 因为排序的过程中各个元素不断接近自己要排好时所对应的位置如果一趟比较下来没有进行交换就说明序列有序。通过设置一个标志flag判断元素是否进行过交换从而减少不必要的比较。 优化代码 // 将前面额冒泡排序算法封装成一个方法 public static void bubbleSort(int[] arr) {// 冒泡排序 的时间复杂度 O(n^2), 自己写出int temp 0; // 临时变量boolean flag false; // 标识变量表示是否进行过交换for (int i 0; i arr.length - 1; i) {for (int j 0; j arr.length - 1 - i; j) {// 如果前面的数比后面的数大则交换if (arr[j] arr[j 1]) {flag true;temp arr[j];arr[j] arr[j 1];arr[j 1] temp;}}//System.out.println(第 (i 1) 趟排序后的数组);//System.out.println(Arrays.toString(arr));if (!flag) { // 在一趟排序中一次交换都没有发生过break;} else {flag false; // 重置flag!!!, 进行下次判断}} } 时间复杂度最坏情况O(N^2) 最好情况O(N) 空间复杂度O(1) 小结冒泡排序规则 (1) 一共进行 数组的大小-1 次 的循环 (2)每一趟排序的次数在逐渐的减少 (3) 如果我们发现在某趟排序中没有发生一次交换 可以提前结束冒泡排序。这个就是优化 选择排序(SelectSort) 选择排序SelectSort的基本思路 1. 选择排序一共有 数组大小 - 1 轮排序 2. 每1轮排序又是一个循环, 循环的规则(代码) 2.1先假定当前这个数是最小数 2.2 然后和后面的每个数进行比较如果发现有比当前数更小的数就重新确定最小数并得到下标 2.3 当遍历到数组的最后时就得到本轮最小数和下标 2.4 交换 [代码中再继续说 ] 图解 代码详解 import java.util.; public class SelectSort {//selectsort排序的方法、public static void selectSort(int[] arr){for(int i0;iarr.length-1;i){int minIdexi;//设第一个数为最小同时将其索引在数组中的位置用minIndex表示int minarr[i];//用min记录最小的数for(int ji1;jarr.length;j){if(minarr[j]){minarr[j];//通过选择将最小的数选出然后更新min和minIndexminIdexj;}}arr[minIdex]arr[i];//将当前位置的数和最小数交换arr[i]min;System.out.println(这是第i次排序结果是);//记录排序的过程System.out.println(Arrays.toString(arr));}} //测试排序public static void main(String[] args){Scanner scnew Scanner(System.in);int[] arrnew int[5];System.out.println(请输入你要排序的数组);for(int i0;i5;i){arr[i]sc.nextInt();}selectSort(arr);System.out.println(排序好后的数组是:);for(int i0;i5;i){System.out.print(arr[i] );}} }运行结果通过运行过程来展示排序过程 时间复杂度最坏情况O(N^2) 最好情况O(N^2) 空间复杂度O(1) 插入排序InsertSort 插入排序InsertSort基本思路把n个待排序的元素看成为一个有序表和一个无序表开始时有序表中只包含一个元素数组的第一个元素,.无序表中包含n-1个元素排序过程中每次从无序表中取出第一个元素把它的排序码依次与有序的排序码进行比较将它插入到有序表中的适当位置使其成为新的有序表 图解 代码详解 import java.util.; public class InsertSort { //InsertSort方法public static void insertSort(int[] arr){for(int i1;iarr.length;i){int insertValarr[i];//将无序的数组的第一个元素记录是后面要插入的数据int insertIndexi-1;//同时有序的数组的最后一个元素的索引元素在数组中的位置记录while(insertIndex0 insertValarr[insertIndex]){//判断条件二者要同时满足arr[insertIndex1]arr[insertIndex];//将有序数组比insertVal小的元素后挪insertIndex–;}arr[insertIndex1]insertVal;//将insertVal插入合适的位置System.out.println(第i趟的排序为);//记录排序过程System.out.println(Arrays.toString(arr));}} //排序测试public static void main(String[] args){Scanner scnew Scanner(System.in);int[] arrnew int[5];System.out.println(请输入要排序的数组);for(int i0;i arr.length;i){arr[i]sc.nextInt();}insertSort(arr);System.out.println(输出排好序的数组);for(int i0;iarr.length;i){System.out.print(arr[i] );}} }运行结果通过运行过程来展示排序过程 时间复杂度最坏情况下为O(NN)此时待排序列为逆序或者说接近逆序 最好情况下为O(N)此时待排序列为升序或者说接近升序。 空间复杂度O(1) 希尔排序(ShellSort) 希尔排序ShellSort基本思路希尔排序先将待排序列进行预排序使待排序列接近有序然后再对该序列进行一次插入排序此时插入排序的时间复杂度为O(N) 图解 静态图解 法一交换法代码详解 import java.util.; public class ShellSort { //ShellSort的方法public static void shellSort(int[] arr){int count0;for(int gap arr.length/2;gap0;gap/2){//将每次要排序的组别逐渐缩小for(int igap;iarr.length;i){//gap~arr.length是该组别一共要交换的次数for(int ji-gap;j0;j-gap){if(arr[j]arr[jgap]){//通过交换对数组进行排序int temparr[j];arr[j]arr[jgap];arr[jgap]temp;}}}System.out.println(第(count)趟希尔排序是Arrays.toString((arr)));//记录希尔排序的过程}}//ShellSort的测试public static void main(String[] args){Scanner scnew Scanner(System.in);int[] arrnew int[]{8,9,1,7,2,3,5,4,6,0};System.out.println(排序前Arrays.toString((arr)));System.out.println();shellSort(arr);System.out.println(排序后Arrays.toString(arr));} } 运行结果通过运行过程来展示排序过程 法二移位法–插入排序的优化代码详解 import java.util.; public class ShellSort2 {//对交换式的希尔排序进行优化-移位法public static void shellSort2(int[] arr){int count0;// 增量gap, 并逐步的缩小增量for (int gap arr.length / 2; gap 0; gap / 2) {// 从第gap个元素逐个对其所在的组进行直接插入排序for (int i gap; i arr.length; i) {int j i;int temp arr[j];if (arr[j] arr[j - gap]) {while (j - gap 0 temp arr[j - gap]) {//移动arr[j] arr[j-gap];j - gap;}//当退出while后就给temp找到插入的位置arr[j] temp;}}}}//shellSort2测试public static void main(String[] args){Scanner scnew Scanner(System.in);int[] arrnew int[]{8,9,1,7,2,3,5,4,6,0};System.out.println(排序前 Arrays.toString((arr)));System.out.println();shellSort2(arr);System.out.println(排序后Arrays.toString(arr));} }运行结果 时间复杂度平均O(N^1.3) 空间复杂度O(1) 快速排序QuickSort 快速排序QuickSort的基本思路 1.选出一个数据一般是最左边或是最右边的存放在temp变量中在该数据位置形成一个坑 2、还是定义一个l和一个RL从左向右走R从右向左走。若在最左边挖坑则需要R先走若在最右边挖坑则需要L先走 图解 代码详解 import java.util.; public class QuickSort { //QuickSort方法public static void quickSort(int[] arr, int left, int right) {int l left; //左下标int r right; //右下标//pivot 中轴值int pivot arr[(left right) / 2];int temp 0; //临时变量作为交换时使用//while循环的目的是让比pivot 值小放到左边//比pivot 值大放到右边while (l r) {//在pivot的左边一直找,找到大于等于pivot值,才退出while (arr[l] pivot) {l 1;}//在pivot的右边一直找,找到小于等于pivot值,才退出while (arr[r] pivot) {r - 1;}//如果l r说明pivot 的左右两的值已经按照左边全部是//小于等于pivot值右边全部是大于等于pivot值if (l r) {break;}//交换temp arr[l];arr[l] arr[r];arr[r] temp;//如果交换完后发现这个arr[l] pivot值 相等 r– 前移if (arr[l] pivot) {r - 1;}//如果交换完后发现这个arr[r] pivot值 相等 l 后移if (arr[r] pivot) {l 1;}}// 如果 l r, 必须l, r–, 否则为出现栈溢出if (l r) {l 1;r - 1;}//向左递归if (left r) {quickSort(arr, left, r);}//向右递归if (right l) {quickSort(arr, l, right);}}public static void main(String[] args) {Scanner sc new Scanner(System.in);//测试排序int[] arr new int[5];System.out.println(请输入你要排序的数组);for (int i 0; i 5; i) {arr[i] sc.nextInt();}quickSort(arr, 0, arr.length - 1);System.out.println(排序好后的数组是:);for (int i 0; i 5; i) {System.out.print(arr[i] );}} }运行结果 时间复杂度平均O(N^LogN) 空间复杂度O(LogN) 归并排序MergetSort 归并排序MergetSort基本思路 该算法是采用分治法Divide and Conquer的一个非常典型的应用。将已有序的子序列合并得到完全有序的序列即先使每个子序列有序再使子序列段间有序。代价是需要额外的内存空间。若将两个有序表合并成一个有序表称为2-路归并。 图解 动态图解 代码详解 import java.util.Arrays; public class MergetSort {//分合方法public static void mergeSort(int[] arr, int left, int right, int[] temp) {if(left right) {int mid (left right) / 2; //中间索引//向左递归进行分解mergeSort(arr, left, mid, temp);//向右递归进行分解mergeSort(arr, mid 1, right, temp);//合并merge(arr, left, mid, right, temp);}}//合并的方法/**** param arr 排序的原始数组* param left 左边有序序列的初始索引* param mid 中间索引* param right 右边索引* param temp 做中转的数组/public static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i left; // 初始化i, 左边有序序列的初始索引int j mid 1; //初始化j, 右边有序序列的初始索引int t 0; // 指向temp数组的当前索引//(一)//先把左右两边(有序)的数据按照规则填充到temp数组//直到左右两边的有序序列有一边处理完毕为止while (i mid j right) {//继续//如果左边的有序序列的当前元素小于等于右边有序序列的当前元素//即将左边的当前元素填充到 temp数组//然后 t, iif(arr[i] arr[j]) {temp[t] arr[i];t 1;i 1;} else { //反之,将右边有序序列的当前元素填充到temp数组temp[t] arr[j];t 1;j 1;}}//(二)//把有剩余数据的一边的数据依次全部填充到tempwhile( i mid) { //左边的有序序列还有剩余的元素就全部填充到temptemp[t] arr[i];t 1;i 1;}while( j right) { //右边的有序序列还有剩余的元素就全部填充到temptemp[t] arr[j];t 1;j 1;}//(三)//将temp数组的元素拷贝到arr//注意并不是每次都拷贝所有t 0;int tempLeft left; ////第一次合并 tempLeft 0 , right 1 // tempLeft 2 right 3 // tL0 ri3//最后一次 tempLeft 0 right 7while(tempLeft right) {arr[tempLeft] temp[t];t 1;tempLeft 1;}}public static void main(String[] args){int[] arr{56,78,13,78,33};int[] tempnew int[arr.length];System.out.println(排序前 Arrays.toString(arr));mergeSort(arr, 0, arr.length - 1, temp);System.out.println(排序后Arrays.toString(arr));} }运行结果 时间复杂度平均O(N^LogN) 空间复杂度O(N) 基数排序RadixSort 基数排序RadixSort基本思路 基数排序是一种非比较型整数排序算法其原理是将整数按位数切割成不同的数字然后按每个位数分别比较。由于整数也可以表达字符串比如名字或日期和特定格式的浮点数所以基数排序也不是只能使用于整数。基数排序是按照低位先排序然后收集再按照高位排序然后再收集依次类推直到最高位。有时候有些属性是有优先级顺序的先按低优先级排序再按高优先级排序。最后的次序就是高优先级高的在前高优先级相同的低优先级高的在前。 图解 代码详解 import java.util.; public class RadixSort {public static void radixSort(int[] arr) {//根据前面的推导过程我们可以得到最终的基数排序代码//1. 得到数组中最大的数的位数int max arr[0]; //假设第一数就是最大数for (int i 1; i arr.length; i) {if (arr[i] max) {max arr[i];}}//得到最大数是几位数int maxLength (max ).length();//定义一个二维数组表示10个桶, 每个桶就是一个一维数组//说明//1. 二维数组包含10个一维数组//2. 为了防止在放入数的时候数据溢出则每个一维数组(桶)大小定为arr.length//3. 名明确基数排序是使用空间换时间的经典算法int[][] bucket new int[10][arr.length];//为了记录每个桶中实际存放了多少个数据,我们定义一个一维数组来记录各个桶的每次放入的数据个数//可以这里理解//比如bucketElementCounts[0] , 记录的就是 bucket[0] 桶的放入数据个数int[] bucketElementCounts new int[10];//这里我们使用循环将代码处理for (int i 0, n 1; i maxLength; i, n * 10) {//(针对每个元素的对应位进行排序处理) 第一次是个位第二次是十位第三次是百位..for (int j 0; j arr.length; j) {//取出每个元素的对应位的值int digitOfElement arr[j] / n % 10;//放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]] arr[j];bucketElementCounts[digitOfElement];}//按照这个桶的顺序(一维数组的下标依次取出数据放入原来数组)int index 0;//遍历每一桶并将桶中是数据放入到原数组for (int k 0; k bucketElementCounts.length; k) {//如果桶中有数据我们才放入到原数组if (bucketElementCounts[k] ! 0) {//循环该桶即第k个桶(即第k个一维数组), 放入for (int l 0; l bucketElementCounts[k]; l) {//取出元素放入到arrarr[index] bucket[k][l];}}//第i1轮处理后需要将每个 bucketElementCounts[k] 0 bucketElementCounts[k] 0;}//System.out.println(第(i1)轮对个位的排序处理 arr Arrays.toString(arr));}}public static void main(String[] args){Scanner sc new Scanner(System.in);//测试排序int[] arr new int[5];System.out.println(请输入你要排序的数组);for (int i 0; i 5; i) {arr[i] sc.nextInt();}radixSort(arr);System.out.println(排序好后的数组是:);for (int i 0; i 5; i) {System.out.print(arr[i] );}} } 运行结果 时间复杂度平均O(N*K) 空间复杂度O(N*K) 最后一张图概括 博客到这里也是结束了制作不易喜欢的小伙伴可以点赞加关注支持下博主这对我真的很重要~~
- 上一篇: 长沙做手机网站建网站公司哪里好
- 下一篇: 长沙做网站多少钱专业建设购物网站
相关文章
-
长沙做手机网站建网站公司哪里好
长沙做手机网站建网站公司哪里好
- 技术栈
- 2026年04月20日
-
长沙做模板网站inove wordpress
长沙做模板网站inove wordpress
- 技术栈
- 2026年04月20日
-
长沙自助模板建站手机端网站推广
长沙自助模板建站手机端网站推广
- 技术栈
- 2026年04月20日
-
长沙做网站多少钱专业建设购物网站
长沙做网站多少钱专业建设购物网站
- 技术栈
- 2026年04月20日
-
长沙做网站开发哪里好免费微信公众号素材网
长沙做网站开发哪里好免费微信公众号素材网
- 技术栈
- 2026年04月20日
-
长沙做网站团队企业官网开源
长沙做网站团队企业官网开源
- 技术栈
- 2026年04月20日
