ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:21.38KB ,
资源ID:12367877      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12367877.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Java各种排序算法.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Java各种排序算法.docx

1、Java各种排序算法Java各种排序算法及代码1)分类:1)插入排序(直接插入排序、希尔排序)2)交换排序(冒泡排序、快速排序)3)选择排序(直接选择排序、堆排序)4)归并排序5)分配排序(箱排序、基数排序)所需辅助空间最多:归并排序所需辅助空间最少:堆排序平均速度最快:快速排序不稳定:快速排序,希尔排序,堆排序。1)选择排序算法的时候1.数据的规模 ; 2.数据的类型 ; 3.数据已有的顺序 一般来说,当数据规模较小时,应选择直接插入排序或冒泡排序。任何排序算法在数据量小时基本体现不出来差距。 考虑数据的类型,比如如果全部是正整数,那么考虑使用桶排序为最优。 考虑数据已有顺序,快排是一种不稳

2、定的排序(当然可以改进),对于大部分排好的数据,快排会浪费大量不必要的步骤。数据量极小,而起已经基本排好序,冒泡是最佳选择。我们说快排好,是指大量随机数据下,快排效果最理想。而不是所有情况。3)总结:按平均的时间性能来分: 1)时间复杂度为O(nlogn)的方法有:快速排序、堆排序和归并排序,其中以快速排序为最好; 2)时间复杂度为O(n2)的有:直接插入排序、起泡排序和简单选择排序,其中以直接插入为最好,特 别是对那些对关键字近似有序的记录序列尤为如此; 3)时间复杂度为O(n)的排序方法只有,基数排序。当待排记录序列按关键字顺序有序时,直接插入排序和起泡排序能达到O(n)的时间复杂度;而对

3、于快速排序而言,这是最不好的情况,此时的时间性能蜕化为O(n2),因此是应该尽量避免的情况。简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。按平均的空间性能来分(指的是排序过程中所需的辅助空间大小): 1) 所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1); 2) 快速排序为O(logn ),为栈所需的辅助空间; 3) 归并排序所需辅助空间最多,其空间复杂度为O(n ); 4)链式基数排序需附设队列首尾指针,则空间复杂度为O(rd )。排序方法的稳定性能: 1) 稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,

4、在排序之前和 经过排序之后,没有改变。 2) 当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。 3) 对于不稳定的排序方法,只要能举出一个实例说明即可。 4) 快速排序,希尔排序和堆排序是不稳定的排序方法。4)插入排序:包括直接插入排序,希尔插入排序。直接插入排序: 将一个记录插入到已经排序好的有序表中。 1, sorted数组的第0个位置没有放数据。 2,从sorted第二个数据开始处理: 如果该数据比它前面的数据要小,说明该数据要往前面移动。 首先将该数据备份放到 sorted的第0位置当哨兵。 然后将该数据前面那个数据后移。 然后往前搜索,找插入位置。 找到插入位置之

5、后讲 第0位置的那个数据插入对应位置。O(n*n), 当待排记录序列为正序时,时间复杂度提高至O(n)。希尔排序(缩小增量排序 diminishing increment sort):先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。面试穿什么,这里找答案!插入排序Java代码:public class InsertionSort / 插入排序:直接插入排序 ,希尔排序 public void straightInsertionSort(double sorted) int sortedLen= sorted.lengt

6、h; for(int j=2;jsortedLen;j+) if(sortedj=0;k-) if(sortedksorted0) sortedk+1=sortedk; else insertPos=k+1; break; sortedinsertPos=sorted0; public void shellInertionSort(double sorted, int inc) int sortedLen= sorted.length; for(int j=inc+1;jsortedLen;j+ ) if(sortedj=0;k-=inc) if(sortedksorted0) sortedk

7、+inc=sortedk; /数据结构课本上这个地方没有给出判读,出错: if(k-inc=0) insertPos = k; else insertPos=k+inc; break; sortedinsertPos=sorted0; public void shellInsertionSort(double sorted) int incs=7,5,3,1; int num= incs.length; int inc=0; for(int j=0;jnum;j+) inc= incsj; shellInertionSort(sorted,inc); public static void ma

8、in(String args) Random random= new Random(6); int arraysize= 21; double sorted=new doublearraysize; System.out.print(Before Sort:); for(int j=1;jarraysize;j+) sortedj= (int)(random.nextDouble()* 100); System.out.print(int)sortedj+ ); System.out.println(); InsertionSort sorter=new InsertionSort(); /

9、sorter.straightInsertionSort(sorted); sorter.shellInsertionSort(sorted); System.out.print(After Sort:); for(int j=1;j0;j-) int end= j; for(int k=1;kend-1;k+) double tempB= sortedk; sortedk= sortedk10e-6) sortedk+1=tempB; public void QuickExchangeSortBackTrack(double sorted,int low,int high) if(lowhi

10、gh) int pivot= findPivot(sorted,low,high); QuickExchangeSortBackTrack(sorted,low,pivot-1); QuickExchangeSortBackTrack(sorted,pivot+1,high); public int findPivot(double sorted, int low, int high) sorted0= sortedlow; while(lowhigh) while(low= sorted0)-high; sortedlow= sortedhigh; while(lowhigh & sorte

11、dlow=sorted0)+low; sortedhigh= sortedlow; sortedlow=sorted0; return low; public static void main(String args) Random random= new Random(6); int arraysize= 21; double sorted=new doublearraysize; System.out.print(Before Sort:); for(int j=1;jarraysize;j+) sortedj= (int)(random.nextDouble()* 100); Syste

12、m.out.print(int)sortedj+ ); System.out.println(); ExchangeSort sorter=new ExchangeSort(); / sorter.BubbleExchangeSort(sorted); sorter.QuickExchangeSortBackTrack(sorted, 1, arraysize-1); System.out.print(After Sort:); for(int j=1;jsorted.length;j+) System.out.print(int)sortedj+ ); System.out.println(

13、); 6)选择排序:分为直接选择排序, 堆排序直接选择排序:第i次选取 i到array.Length-1中间最小的值放在i位置。堆排序:首先,数组里面用层次遍历的顺序放一棵完全二叉树。从最后一个非终端结点往前面调整,直到到达根结点,这个时候除根节点以外的所有非终端节点都已经满足堆得条件了,于是需要调整根节点使得整个树满足堆得条件,于是从根节点开始,沿着它的儿子们往下面走(最大堆沿着最大的儿子走,最小堆沿着最小的儿子走)。 主程序里面,首先从最后一个非终端节点开始调整到根也调整完,形成一个heap, 然后将heap的根放到后面去(即:每次的树大小会变化,但是 root都是在1的位置,以方便计算儿

14、子们的index,所以如果需要升序排列,则要逐步大顶堆。因为根节点被一个个放在后面去了。 降序排列则要建立小顶堆)代码中的问题: 有时候第2个和第3个顺序不对(原因还没搞明白到底代码哪里有错)选择排序Java代码:public class SelectionSort public void straitSelectionSort(double sorted) int sortedLen= sorted.length; for(int j=1;jsortedLen;j+) int jMin= getMinIndex(sorted,j); exchange(sorted,j,jMin); publ

15、ic void exchange(double sorted,int i,int j) int sortedLen= sorted.length; if(isortedLen & jsortedLen & i=0 & j=0) double temp= sortedi; sortedi=sortedj; sortedj=temp; public int getMinIndex(double sorted, int i) int sortedLen= sorted.length; int minJ=1; double min= Double.MAX_VALUE; for(int j=i;jsor

16、tedLen;j+) if(sortedjmin) min= sortedj; minJ= j; return minJ; public void heapAdjust(double sorted,int start,int end) if(startend) double temp= sortedstart;/ 这个地方jend与课本不同,j=end会报错: for(int j=2*start;jend;j *=2) if(j+110e-6) +j; if(temp0;i-) heapAdjust(sorted,i,sortedLen); for(int i=sortedLen;i1;-i)

17、 exchange(sorted,1,i); heapAdjust(sorted,1,i-1); public static void main(String args) Random random= new Random(6); int arraysize=9; double sorted=new doublearraysize; System.out.print(Before Sort:); for(int j=1;jarraysize;j+) sortedj= (int)(random.nextDouble()* 100); System.out.print(int)sortedj+ )

18、; System.out.println(); SelectionSort sorter=new SelectionSort(); / sorter.straitSelectionSort(sorted); sorter.heapSelectionSort(sorted); System.out.print(After Sort:); for(int j=1;jsorted.length;j+) System.out.print(int)sortedj+ ); System.out.println(); 面试穿什么,这里找答案!7)归并排序:将两个或两个以上的有序表组合成一个新的有序表。归并排

19、序要使用一个辅助数组,大小跟原数组相同,递归做法。每次将目标序列分解成两个序列,分别排序两个子序列之后,再将两个排序好的子序列merge到一起。归并排序Java代码:public class MergeSort private double bridge;/辅助数组 public void sort(double obj) if (obj = null) throw new NullPointerException(The param can not be null!); bridge = new doubleobj.length; / 初始化中间数组 mergeSort(obj, 0, ob

20、j.length - 1); / 归并排序 bridge = null; private void mergeSort(double obj, int left, int right) if (left right) int center = (left + right) / 2; mergeSort(obj, left, center); mergeSort(obj, center + 1, right); merge(obj, left, center, right); private void merge(double obj, int left, int center, int rig

21、ht) int mid = center + 1; int third = left; int tmp = left; while (left = center & mid = right) / 从两个数组中取出小的放入中间数组 if (objleft-objmid=10e-6) bridgethird+ = objleft+; else bridgethird+ = objmid+; / 剩余部分依次置入中间数组 while (mid = right) bridgethird+ = objmid+; while (left = center) bridgethird+ = objleft+;

22、 / 将中间数组的内容拷贝回原数组 copy(obj, tmp, right); private void copy(double obj, int left, int right) while (left = right) objleft = bridgeleft; left+; public static void main(String args) Random random = new Random(6); int arraysize = 10; double sorted = new doublearraysize; System.out.print(Before Sort:); f

23、or (int j = 0; j arraysize; j+) sortedj = (int) (random.nextDouble() * 100); System.out.print(int) sortedj + ); System.out.println(); MergeSort sorter = new MergeSort(); sorter.sort(sorted); System.out.print(After Sort:); for (int j = 0; j sorted.length; j+) System.out.print(int) sortedj + ); System.out.println(); 面试穿什么,这里找答案!8)基数排序:使用10个辅助队列,假设最大数的数字位数为 x, 则一共做 x次,从个位数开始往前,以第i位数字的大小为依据,将数据放进辅助队列,搞定之后回收。下次再以高一位开始的数字位为依据。以Vector作辅助队列,基数排序的Java

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1