java学习笔记之数组排序和查找 在Java中如何高效判断数组中是否包含某个元素?
给出的信息太少,比如数组类型是什么?数据分布是怎样的?给个通用的做法:把数组按顺序排好,二进制找。
是升序排序。
比如一个塑料I数组,原来的顺序是,9,8,7,6,5,4,3,2,1。使用()后,得到的结果是1,2,3,4,5,6,7,8,9。
如果需要改变排序,就改成降序,需要改变排序(要排序的内容,())。
选择排序法
想
N个记录文件的直接选择排序可以得到n-1个直接选择排序后的有序结果:①初始状态:无序区为R [1...n],并且有序区域是空的。②在第一次排序中,从无序区域R[1]中选择具有最小关键字的记录R[k]..n],并且它与无序区域中的第一个记录R[1]交换,使得R[1..1]和R[2..n]分别成为增加一条记录的新有序区域和减少一条记录的新无序区域。.....(3)第一次排序。
在第I个排序开始时,当前有序区域和无序区域是R[1..i-1]和R(i..n)分别为。这个排序从当前无序区中选择关键字最小的记录R[k],与无序区中的第一条记录R交换,使R [1...I]和R分别成为增加一条记录的新有序区和减少一条记录的新无序区。
排序实例初始关键字[49 38 65 97 76 13 27 49]
第一次排序后,13 [38 65 97 76 49 27 49]
第二次排序后,13 27 [65 97 76 49 38 49]
在第三遍排序后,13 27 38 [97 76 49 65 49]
在第四遍排序后,13 27 38 49 [76 97 65 49]
第五遍排序后,13 27 38 49 49 [97 65 76]
第六遍排序后,13 27 38 49 49 65 [97 76]
第七次排序后,13 27 38 49 49 65 76 [97]
最终排名结果13 27 38 49 49 65 76 97
Java实现代码如下:
验证了结果的正确性。
气泡法
原则
冒泡排序算法的工作如下:比较相邻的元素。如果第一个比第二个大,就把它们换了。对每对相邻的元素做同样的工作,从第一对到最后一对。此时,最后一个元素应该是最大的数字。对除最后一个元素之外的所有元素重复上述步骤。每次对越来越少的元素继续重复上述步骤,直到没有要比较的数字对。算法分析算法稳定性冒泡排序是将小元素前移或大元素后移。比较是两个相邻元素的比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我认为你赢了。;不要厌倦再次交换它们;如果两个相等的元素不相邻,即使通过之前的两两交换相邻,此时也不会交换,所以相同元素的顺序没有改变,所以冒泡排序是一种稳定的排序算法。
Java实现代码:
?
插入排序
插入排序的算法描述是一种简单直观的排序算法。它的工作原理是构造一个有序序列,在排序后的序列中从后向前扫描无序数据,找到对应的位置并插入。在插入排序的实现中,通常采用原地排序(即只有O(1)额外空间的排序),所以在从后向前扫描的过程中,需要反复地将排序后的元素逐步向后移动,为最新的元素提供插入空间。
算法描述一般来说,插入排序是通过就地在数组上实现的。具体算法描述如下:从第一个元素开始,可以认为这个元素已经排序取出下一个元素,在排序后的元素序列中从后向前扫描。如果这个元素(已排序)大于新元素,将其移动到下一个位置并重复步骤3,直到找到已排序元素小于或等于新元素的位置,然后重复步骤2-5。如果比较操作的成本大于交换操作的成本,可以采用二分搜索法方法来减少比较操作的次数。这种算法可以看作是插入排序的一种变体,称为二分搜索法排序。
Java示例代码如下:
壳牌石油公司排序
Hill排序通过将所有比较的元素分成几个区域来提高插入排序的性能。这允许一个元素一次向它的最终位置迈出一大步。然后算法采取越来越小的步骤进行排序,算法的最后一步是普通的插入排序,但是到了这一步,要排序的数据就排列的差不多了(此时插入排序更快)。假设在一个按升序排序的数组的末尾有一个非常小的数据。如果使用复杂度为O(n2)的排序(冒泡排序或插入排序),可能需要n次比较和交换才能将数据移动到正确的位置。但是,希尔排序会以较大的步长移动数据,因此小数据只需几次比较和交换就可以到达正确的位置。更好地理解Hill排序实现:将数组列在一个表中,并对列进行排序(按插入排序)。重复此过程,但每次使用更长的列。最后,整个表格只有一列。将数组转换成表格的目的是为了更好地理解这个算法。算法本身只对原始数组进行排序(通过增加索引的步长,比如用i step_size代替I)。
例如,假设有这样一组数字[13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10],如果我们以步长5开始排序,我们可以通过将这个列表放在一个有5列的表中来更好地描述算法。
所以它们应该是这样的:
然后我们对每一列进行排序:当上述四行数字按顺序连接在一起时,我们得到:[10 14 73 25 23 13 27 94 33 39 25 94 65 82 45]。这时10已经移动到正确的位置,然后分3步排序:排序后变成:最后分1步排序(此时是简单的插入排序)。
在实际使用过程中,排序的数据绝对不只是十个,而是以上的思路。其实排序只是插入排序的一种优化。
快速排序思路:从待排序的记录序列中选择一条记录(通常是第一条记录)作为支点,然后将其他关键字小于k1的记录移到前面,关键字大于k1的记录移到后面。结果,要排序的序列被分成两个子表,最后在分割线的位置找到带有关键字k1的记录。算法步骤:假设要划分的序列为r[left],R [left1],...r [right],实现上面的除法过程,可以设置两个指针I和J,它们的初始值分别是左和右。首先将参考记录r[left]移动到变量X中,变量X为r[left],即r[i]相当于一个空单元格,然后重复下面两个扫描过程,直到I和J相遇。直到r[j]。key (2)i从左向后扫描,直到r[i],将r[i]移动到空单元格r[j],此时r[i]相当于空单元格。当I和J相遇时,r[i](或r[j])相当于一个空单元格,r[i]左边所有记录的关键字不大于基准记录的关键字,而r[i]右边所有记录的关键字不小于基准记录的关键字。最后,将基准记录移动到r[i],并完成一个划分过程。最后,通过递归调用排序函数对子表进行排序。Java示例代码如下:
归并排序归并排序是一种基于归并运算的有效排序算法。这个算法是分而治之的一个非常典型的应用。值得注意的是,归并排序是一种稳定的排序方法。合并有序子序列以获得完全有序的序列;也就是说,首先对每个子序列进行排序,然后对子序列段进行排序。如果两个有序表合并成一个有序表,称为双向合并。归并操作归并操作(也叫归并算法)是指将两个顺序序列合并成一个顺序序列的方法。如果有系列(6,202,100,301,38,8,1)初始状态:6,202,100,301,38,8,1第一次合并后:{6,202},{100,301},{8,38},{1},比较次数:3;第二次合并后:{6,100,202,301},{1,8,38},比较次数:4;第三次合并后:{1,6,8,38,100,202,301},比较次数:4;对比总数为:34 411;倒数是14;算法对归并操作的工作原理描述如下:第一步:申请一个大小为两个排序序列之和的空间,用来存放归并后的序列;步骤2:设置两个指针,其初始位置分别为两个排序序列的起始位置;第三步:比较两个指针所指向的元素,选择一个相对较小的元素放入合并空间,将指针移动到下一个位置重复第三步,直到一个指针超过序列的末尾,直接复制另一个序列的所有剩余元素。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。