当前位置:首页 >> 互联网
互联网

十大经典排序算法(java实现、配图解,附GCC)

2025-08-19 12:19

ays =new int[]{15,63,97,12,235,66}; 5 for (int i=0;i arrays[j+1]){10 int temp = 0;//类似空桶11 temp = arrays[j]; //A桶中都水浸泡空桶C中都12 arrays[j] = arrays[j+1];//把B桶的水浸泡A桶中都13 arrays[j+1] = temp;//把C桶的水浸泡B桶中都14 }15 }16 }17 System.out.println(Arrays.toString(arrays));18 }19 }

左至右排加结果展出:

2.慢速左至右排加

慢速左至右排加(Quicksort),麻省理工学院词汇,适用领域Pascal,c++等语言,是对冒泡左至右排加解例的一种改良。

2.1解决问题分析方例

慢速左至右排加是对冒泡左至右排加的一种改良。通过一趟左至右排加一定都会左至右排加的原始数据拆计有独立的两部份,其中都一部份的所有原始数据都比另一部份所有的原始数据都要小,然后再行按此方例对这两部份原始数据分别来进行慢速左至右排加,整个左至右排加过程可以形固定式化来进行,以此大幅提高整个原始数据转变成全局核酸

2.2 动图摄像 2.3范例展出 1 import java.util.Arrays; 2 public class QuickSort { 3 public static void main(String[] args) { 4 int[] arrays = new int[]{15,63,97,12,235,66}; 5 sort(arrays,0,arrays.length-1); 6 System.out.println(Arrays.toString(arrays)); 7 } 8 public static void sort(int[] arrays,int left,int right){ 9 int l = left;10 int r = right;11 12 int pivot = arrays[(left+right)/2];13 int temp = 0;14 while (lpivot){22 r---;23 }24 if (l>=r){25 break;26 }27 temp = arrays[l];28 arrays[l] = arrays[r];29 arrays[r] = temp;30 31 // 中介再来原始数据arrays[l] = pivot32 if (arrays[l]==pivot){33 r---;34 }35 if (arrays[r]==pivot){36 l++;37 }38 if (r==l){39 l++;40 r---;41 }42 if (leftl){46 sort(arrays,l,right);47 }48 }49 }50 }

左至右排加结果展出:

3.基数左至右排加

基数左至右排加(radix sort)归属于“平原则上分配固定式左至右排加”(distribution sort),称作“桶侄例”(bucket sort)或bin sort,顾名思义,它是透过节点的部份资料,一定都会左至右排加的金属元素平原则上分配至某些“桶”中都,藉以大幅提高左至右排加的作用,基数左至右排加例是归属于耐用性的左至右排加,其时长算例为O (nlog(r)m),其中都r为所采取用的基数,而m为火炉数,在某些时候,基数左至右排加例的稳定性少于其它的耐用性左至右排加例。

基数左至右排加是1887年赫尔曼、何乐礼发明的。思想是讲有理数按小数切割成有所不同的数字,然后按每个小数分别比起。

3.1解决问题分析方例

讲所有的待比起数量级统一设置为比方说的数位较宽,小数比起短的数后面补零,然后从最地位开始分作来进行一次左至右排加,这样从最低位左至右排加以之前到最高位左至右排加顺利再来成直至,有理数就转变成一个全局核酸。

3.2 动图摄像 3.3范例展出 1 import java.text.SimpleDateFormat; 2 import java.util.Arrays; 3 import java.util.Date; 4 5 public class BasicSort { 6 7 public static void main(String[] args) { 8 int[] arrays = new int[]{15,63,97,12,235,66}; 9 SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-mm-dd HH:MM:ss:SS"); 10 System.out.println("开始左至右排加之前:"+simpleDateFormat.format(new Date())); 11 sort(arrays); 12 System.out.println("左至右排加中止:"+simpleDateFormat.format(new Date())); 13 } 14 15 // 1.利用原核酸的远超过位多少 16 // @param arrays 17 public static void sort(int[] arrays){ 18 19 // 利用远超过小数 20 int max = 0; 21 for(int i=0;imax){ 23 max = arrays[i]; 24 } 25 } 26 27 // 利用字符串较宽,所以把int类型转字符串类型 28 int maxLength = (max+"").length(); 29 30 // 定义二维codice_,大小10,说明10个桶,每一个桶则是一个codice_ 31 // [[],[],[],[],[]...] 32 int[][] bucket = new int[10][arrays.length]; 33 34 // 主要用途codice_ 35 int[] bucketElementCount = new int[10]; 36 37 // 反向利用无序有理数 38 for (int j=0;j左至右排加结果展出:

4.弹出左至右排加

弹出左至右排加,一般也被称为比方说弹出左至右排加。对于少量金属元素的左至右排加,它是一个有效的解例 。弹出左至右排加是一种最简单的左至右排加方例,它的理论上思想是将一个历史记录弹出到仍然排好序的全局所列中都,从而一个在此在此之后、历史记录数增1的全局所列。在其解决问题过程广泛应用于双层反向,外层反向对除了第一个金属元素之外的所有金属元素,内层反向对近期金属元素后面全局所列来进行待弹出一段距离查找,并来进行移动 。

4.1解决问题分析方例

弹出左至右排加的同义导方固定式像许多人左至右排加自已扑克字牌。开始时,我们的手为空并且客厅上的字牌面向下。然后,我们每次从客厅上拿走一张字牌并将它弹出手中都确实的一段距离。为了认出一张字牌的确实一段距离,我们从右到左将它与已在手中都的每张字牌来进行比起。拿在手上的字牌总是左至右排加好的,原来这些字牌是客厅上字牌火炉中都上端的字牌。

弹出左至右排加是同义在待左至右排加的金属元素中都,推论后面n-1(其中都n>=2)取值仍然是排好左至右的,现将第n取值插到后面仍然排好的核酸中都,然后认出合适自己的一段距离,使得弹出第n取值的这个核酸也是排好左至右的。按照此例对所有金属元素来进行弹出,直到整个核酸排为全局的过程,称为弹出左至右排加。

左至右排加结果展出:

4.3范例展出 1 public class InsertSort { 2 public static void main(String[] args) { 3 int[] array = new int[]{15,63,97,12,235,66}; 4 //遏制拿去每一个金属元素 5 for(int i=1;i=1;j---){ 8 //是否是之比后面的金属元素 9 if (array[j]左至右排加结果展出:

5.选择左至右排加

选择左至右排加(Selection sort)是一种简单直观的左至右排加解例。它的同义导分析方例是:第一次从待左至右排加的原始数据金属元素中都选总和(或远超过)的一个金属元素,存摆放在核酸的应在一段距离,然后再行从悉数的未左至右排加金属元素中都寻认出总和(大)金属元素,然后放于已左至右排加的核酸的结尾处。以此类推,直到全部待左至右排加的原始数据金属元素的取值为零。选择左至右排加是不保持稳定的左至右排加方例。

5.1解决问题分析方例

第一次从待左至右排加的原始数据金属元素中都选总和(或远超过)的一个金属元素,存摆放在核酸的应在一段距离,然后再行从悉数的未左至右排加金属元素中都寻认出总和(大)金属元素,然后放于已左至右排加的核酸的结尾处。以此类推,直到全部待左至右排加的原始数据金属元素的取值为零。选择左至右排加是不保持稳定的左至右排加方例。

5.2 动图摄像 5.3范例展出 1 import java.util.Arrays; 2 public class SelectSort { 3 public static void main(String[] args) { 4 int[] arr = new int[]{15,63,97,12,235,66}; 5 for (int i=0;ii;j---){ 8 9 if (arr[j]左至右排加结果展出:

6.格林左至右排加

格林左至右排加(Shell's Sort)是弹出左至右排加的一种称作“扩大渐进左至右排加”(Diminishing Increment Sort),是弹出左至右排加解例的一种更高效的改良国际版本。格林左至右排加是非保持稳定左至右排加解例。该方例因 D.L.Shell 于 1959 年提出而原是。

格林左至右排加是把历史记录按下譬如说一定渐进分组,对每组广泛应用于比方说弹出左至右排加解例左至右排加;随着渐进慢慢地减少,每组相关联的关键词越好来越好多,当渐进减至 1 时,整个元数据恰被计有举例来说,解例便终止。

6.1解决问题分析方例

先取用一个之比n的有理数d1作为第一个渐进,把元数据的全部历史记录分组。所有距离为d1的位数的历史记录摆放在同一个组中都。先在各组内来进行比方说弹出左至右排加;然后,取用第二个渐进d2

般的初次取用核酸的一半为渐进,直至每次减至,直到渐进为1。

6.2 动图摄像 6.3范例展出 1 import java.util.Arrays; 2 public class ShellSort { 3 public static void main(String[] args) { 4 int[] array = new int[]{15,63,97,12,235,66}; 5 6 // 解决问题渐进变化 7 for (int gap = array.length/2;gap>0;gap/=2){ 8 9 for (int i=gap;i=0;j-=gap){12 if (array[j]>array[j+gap]){13 int temp = 0;14 temp = array[j];15 array[j] = array[j+gap];16 array[j+gap] = temp;17 }18 }19 }20 }21 System.out.println(Arrays.toString(array));22 }23 } 7.都需左至右排加

都需左至右排加(Merge Sort)是建立在都需操作上的一种有效,保持稳定的左至右排加解例,该解例是引入分治例(Divide and Conquer)的一个非常相比起的广泛应用。将已全局的侄核酸并入,得不到再来全全局的核酸;即先使每个侄核酸全局,再行使侄核酸段间全局。若将两个全局所列并入成一个全局所列,称为南路都需。

7.1解决问题分析方例第一步:申特地室内空间,使其大小为两个仍然左至右排加核酸之和,该室内空间用来暂存并入后的核酸第二步:设定两个赋值,最初一段距离计有两个仍然左至右排加核酸的应在一段距离第三步:比起两个赋值所看成的金属元素,选择相对小的金属元素放入到并入室内空间,并移动赋值到下一一段距离以此类推方式中3直到某一赋值大于核酸尾将另一核酸只剩的所有金属元素比方说复制到并入核酸尾

我们不必将两个仍然全局的侄核酸并入成一个全局核酸,比如上图再次一次并入,将[2,4,5,6]和[1,3,7,8]仍然全局的侄核酸并入在此之后核酸[1,2,3,4,5,6,7,8]

7.2 动图摄像 7.3范例展出 1 import java.util.Arrays; 2 public class MSort { 3 public static void main(String[] args) { 4 int[] array = new int[]{15,63,97,12,235,66}; 5 //临时codice_ 6 int[] temp = new int[array.length]; 7 sort(array,0,array.length-1,temp); 8 System.out.println(Arrays.toString(array)); 9 10 }11 public static void sort(int[] array,int left,int right,int[] temp){12 if (left左至右排加结果展出:

8.可用左至右排加

可用左至右排加是一个非基于比起的左至右排加解例,该解例于1954年由 Harold H. Seward 提出。它的占优在于在对一定全域内的有理数左至右排加时,它的算例为Ο(n+k)(其中都k是有理数的全域),快于任何比起左至右排加解例。 当然这是一种牺牲室内空间换回用时长的花钱例,而且当O(k)>O(n*log(n))的时候其稳定性反而不如基于比起的左至右排加(基于比起的左至右排加的时长算例在理论上的极限值是O(n*log(n)), 如都需左至右排加,火炉左至右排加)

8.1解决问题分析方例

推论可用的时域所列L的较宽为n,L=L1,L2,..,Ln;时域所列的金属元素归属于更少等价关系集S,|S|=k且k=O(n),S={S1,S2,..Sk};则可用左至右排加可以描述如下:

读取整个交集S,对每一个Si∈S,认出在时域所列L中都之比等于Si的金属元素的取值T(Si);读取整个时域所列L,对L中都的每一个金属元素Li,将Li摆放在输出时域所列的第T(Li)个一段距离上,并将T(Li)减1。 8.2 动图摄像 8.3范例展出 1 public class CountSort { 2 public static void main(String[]args){ 3 //左至右排加的codice_ 4 int a[]={15,63,97,12,235,66}; 5 int b[]=countSort(a); 6 for(int i:b){ 7 System.out.print( i+","); 8 } 9 System.out.println();10 }11 public static int[] countSort(int[]a){12 int b[] = new int[a.length];13 int max = a[0],min = a[0];14 for(int i:a){15 if(i>max){16 max=i;17 }18 if(i=0;---i){31 b[---c[a[i]-min]]=a[i];//按位址用的方固定式取用出c的金属元素32 }33 return b;34 }35 }

左至右排加结果展出:

火炉左至右排加

火炉左至右排加(英语:Heapsort)是同义利用火炉这种原始链所列所设计的一种左至右排加解例。火炉是一个最简单再来全基元的结构,并同时满足火炉积的性质:即侄给定的节点或索引总是之比(或者大于)它的父结点。

9.1解决问题分析方例创建一个火炉 H[0……n-1];把火炉首(远超过值)和火炉尾互换;把火炉的尺寸扩大 1,并命令行 shift_down(0),目的是把在此在此之后codice_底部原始数据变更到相应一段距离;以此类推方式中 2,直到火炉的尺寸为 1。 9.2 动图摄像 9.3范例展出 1 public static int[] heapSort(int[] array) { 2 //这之中金属元素的索引是从0开始的,所以再次一个非叶侄给定array.length/2 - 1 3 for (int i = array.length / 2 - 1; i>= 0; i---) { 4 adjustHeap(array, i, array.length); //变更火炉 5 } 6 7 // 上述逻辑,建火炉中止 8 // 请注意,开始左至右排加逻辑 9 for (int j = array.length - 1; j> 0; j---) {10 // 金属元素中介,作用是去掉大顶火炉11 // 把大顶火炉的六根金属元素,放于codice_的再次;换句话说,就是每一次的火炉变更在此之后,才都会有一个金属元素到达自己的在此之后一段距离12 swap(array, 0, j);13 // 金属元素中介在此之后,毫无疑问,再次一个金属元素不必再行考虑左至右排加问题了。14 // 接下来我们不必左至右排加的,就是仍然去掉了部份金属元素的火炉了,这也是为什么此方例摆放在反向之中的因素15 // 而这之中,实质是自上而下,自左向右来进行变更的16 adjustHeap(array, 0, j);17 }18 return array;19 }20 21 /**22 * 整个火炉左至右排加最关键的大多23 * @param array 待组火炉24 * @param i 应在给定25 * @param length 火炉的较宽26 */27 public static void adjustHeap(int[] array, int i, int length) {28 // 先把近期金属元素取用出来,因为近期金属元素可能要以之前移动29 int temp = array[i];30 for (int k = 2 * i + 1; k < length; k = 2 * k + 1) { //2*i+1为左侄树i的左侄树(因为i是从0开始的),2*k+1为k的左侄树31 // 让k先看成侄结点中都远超过的结点32 if (k + 1 < length && array[k] < array[k + 1]) { //如果有右侄树,并且右侄树大于左侄树33 k++;34 }35 //如果发现给定(左右侄给定)大于六根给定,则来进行值的中介36 if (array[k]> temp) {37 swap(array, i, k);38 // 如果侄结点更换了,那么,以侄结点为六根的侄树都会受阻,所以,反向对侄结点所在的树继续来进行判断39 i = k;40 } else { //不用中介,比方说终止反向41 break;42 }43 }44 }45 46 /**47 * 中介金属元素48 * @param arr49 * @param a 金属元素的下标50 * @param b 金属元素的下标51 */52 public static void swap(int[] arr, int a, int b) {53 int temp = arr[a];54 arr[a] = arr[b];55 arr[b] = temp;56 }

左至右排加结果展出:

10.桶左至右排加

桶左至右排加 (Bucket sort)或所谓的箱左至右排加,是一个左至右排加解例,同义导的分析方例是将codice_分到更少数量的桶侄之中。每个桶侄再行个别左至右排加(有可能再行广泛应用于别的左至右排加解例或是以形固定式化方固定式继续广泛应用于桶左至右排加来进行左至右排加)。桶左至右排加是鸽巢左至右排加的一种归纳结果。当要被左至右排加的codice_内的数量级是原则上匀平原则上分配的时候,桶左至右排加广泛应用于时域时长(Θ(n))。但桶左至右排加并不是 比起左至右排加,他不受到 O(n log n) 极限值的影响。

10.1解决问题分析方例

假定:可用是由一个随机过程产生的[0, 1)该线上原则上匀分布的乘积。将该线[0, 1)划分为n个大小小于的侄该线(桶),每桶大小1/n:[0, 1/n), [1/n, 2/n), [2/n, 3/n),…,[k/n, (k+1)/n ),…将n个可用金属元素平原则上分配到这些桶中都,对桶中都金属元素来进行左至右排加,然后分作连接桶可用0 ≤A[1..n] <1主要用途codice_B[0..n-1]是一赋值codice_,看成桶(链所列)。

10.2 动图摄像

然后,金属元素在每个桶中都左至右排加:

左至右排加结果展出:

1 public static void basket(int data[])//data为待左至右排加codice_ 2 { 3 int n=data.length; 4 int bask[][]=new int[10][n]; 5 int index[]=new int[10]; 6 int max=Integer.MIN_VALUE; 7 for(int i=0;i(Integer.toString(data[i]).length())?max:(Integer.toString(data[i]).length());10 }11 String str;12 for(int i=max-1;i>=0;i---)13 {14 for(int j=0;j左至右排加结果展出:

总结:

以上便是本篇文章所写的关于独创作品独创左至右排加解例所有细节了,码字难以,对你有帮助的话,特地给个三连(关注、点赞、收藏)有问题可卫报四区专页讨论。原文链接:_3arithmetic-01.html

藿香正气口服液
广州中医正规的医院
辽宁妇科医院哪个好
深圳妇科专科医院有哪些
石家庄白癜风医院挂号

上一篇: 医生劝告:宝宝没到2岁前,3种辅食最好不及吃,容易拖垮脾胃

下一篇: 玉兔二号注意到厘米级透明的月球玻璃球

相关阅读
友情链接