java排序大全文档格式.docx

上传人:b****6 文档编号:17619691 上传时间:2022-12-07 格式:DOCX 页数:14 大小:20.17KB
下载 相关 举报
java排序大全文档格式.docx_第1页
第1页 / 共14页
java排序大全文档格式.docx_第2页
第2页 / 共14页
java排序大全文档格式.docx_第3页
第3页 / 共14页
java排序大全文档格式.docx_第4页
第4页 / 共14页
java排序大全文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

java排序大全文档格式.docx

《java排序大全文档格式.docx》由会员分享,可在线阅读,更多相关《java排序大全文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

java排序大全文档格式.docx

array[from]=array[to];

array[to]=tmp;

}一插入排序

该算法在数据规模小的时候十分高效,该算法每次插入第K+1到前K个有序数组中一个合适位置,K从0开始到N-1,从而完成排序:

/**

@author 

yovn

*/

InsertSorter<

/* 

(non-Javadoc)

@see 

algorithms.Sorter#sort(E[], 

int, 

int)

array, 

int 

from, 

len) 

tmp=null;

for(int 

i=from+1;

i<

from+len;

i++)

tmp=array[i];

j=i;

for(;

j>

from;

j--)

if(pareTo(array[j-1])<

0)

array[j]=array[j-1];

else 

break;

array[j]=tmp;

二冒泡排序

这可能是最简单的排序算法了,算法思想是每次从数组末端开始比较相邻两元素,把第i小的冒泡到数组的第i个位置。

i从0一直到N-1从而完成排序。

(当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到数组的第N-i个位置。

*

BubbleSorter<

private 

static 

boolean 

DWON=true;

bubble_down(E[] 

len)

i=from;

j=from+len-1;

i;

if(array[j].compareTo(array[j-1])<

swap(array,j-1,j);

bubble_up(E[] 

i=from+len-1;

i>

=from;

i--)

j=from;

j<

j++)

if(array[j].compareTo(array[j+1])>

swap(array,j,j+1);

@Override

if(DWON)

bubble_down(array,from,len);

else

bubble_up(array,from,len);

三,选择排序

选择排序相对于冒泡来说,它不是每次发现逆序都交换,而是在找到全局第i小的时候记下该元素位置,最后跟第i个元素交换,从而保证数组最终的有序。

相对与插入排序来说,选择排序每次选出的都是全局第i小的,不会调整前i个元素了。

SelectSorter<

i=0;

len;

smallest=i;

j=i+from;

if(array[j].compareTo(array[smallest])<

smallest=j;

swap(array,i,smallest);

 

四Shell排序

Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点:

1)当数据规模小的时候非常高效

2)当给定数据已经有序时的时间代价为O(N)

所以,Shell排序每次把数据分成若个小块,来使用插入排序,而且之后在这若个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停的合并小块,知道最后成一个块,并使用插入排序。

这里每次分成若干小块是通过“增量”来控制的,开始时增量交大,接近N/2,从而使得分割出来接近N/2个小块,逐渐的减小“增量“最终到减小到1。

一直较好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5)

所以我在实现Shell排序的时候采用该增量序列

ShellSorter<

Our 

delta 

value 

choose 

2^k-1,2^(k-1)-1,.7,3,1.

complexity 

is 

O(n^1.5)

//1.calculate 

the 

first 

value;

value=1;

while((value+1)*2<

value=(value+1)*2-1;

delta=value;

delta>

=1;

delta=(delta+1)/2-1)

delta;

modify_insert_sort(array,from+i,len-i,delta);

modify_insert_sort(E[] 

len,int 

delta) 

if(len<

=1)return;

i=from+delta;

i+=delta)

j-=delta)

if(pareTo(array[j-delta])<

array[j]=array[j-delta];

五快速排序

快速排序是目前使用可能最广泛的排序算法了。

一般分如下步骤:

1)选择一个枢纽元素(有很对选法,我的实现里采用去中间元素的简单方法)

2)使用该枢纽元素分割数组,使得比该元素小的元素在它的左边,比它大的在右边。

并把枢纽元素放在合适的位置。

3)根据枢纽元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。

快速排序的核心在于分割算法,也可以说是最有技巧的部分。

QuickSorter<

q_sort(array,from,from+len-1);

q_sort(E[] 

to) 

if(to-from<

1)return;

pivot=selectPivot(array,from,to);

pivot=partion(array,from,to,pivot);

q_sort(array,from,pivot-1);

q_sort(array,pivot+1,to);

partion(E[] 

to, 

pivot) 

tmp=array[pivot];

array[pivot]=array[to];

//now 

to'

position 

available

while(from!

=to)

while(from<

to&

&

array[from].compareTo(tmp)<

=0)from++;

if(from<

array[to]=array[from];

from'

to--;

array[to].compareTo(tmp)>

=0)to--;

available 

now 

from++;

array[from]=tmp;

return 

selectPivot(E[] 

(from+to)/2;

六归并排序

算法思想是每次把待排序列分成两部分,分别对这两部分递归地用归并排序,完成后把这两个子部分合并成一个

序列。

归并排序借助一个全局性临时数组来方便对子序列的归并,该算法核心在于归并。

import 

java.lang.reflect.Array;

MergeSorter<

@SuppressWarnings("

unchecked"

E[] 

temporary=(E[])Array.newInstance(array[0].getClass(),len);

merge_sort(array,from,from+len-1,temporary);

merge_sort(E[] 

temporary) 

if(to<

=from)

return;

middle=(from+to)/2;

merge_sort(array,from,middle,temporary);

merge_sort(array,middle+1,to,temporary);

merge(array,from,to,middle,temporary);

merge(E[] 

middle, 

k=0,leftIndex=0,rightIndex=to-from;

System.arraycopy(array, 

temporary, 

0, 

middle-from+1);

to-middle;

temporary[to-from-i]=array[middle+i+1];

while(k<

to-from+1)

if(temporary[leftIndex].compareTo(temporary[rightIndex])<

array[k+from]=temporary[leftIndex++];

array[k+from]=temporary[rightIndex--];

k++;

七堆排序

堆是一种完全二叉树,一般使用数组来实现。

堆主要有两种核心操作,

1)从指定节点向上调整(shiftUp)

2)从指定节点向下调整(shiftDown)

建堆,以及删除堆定节点使用shiftDwon,而在插入节点时一般结合两种操作一起使用。

堆排序借助最大值堆来实现,第i次从堆顶移除最大值放到数组的倒数第i个位置,然后shiftDown到倒数第i+1个位置,一共执行N此调整,即完成排序。

显然,堆排序也是一种选择性的排序,每次选择第i大的元素。

HeapSorter<

build_heap(array,from,len);

//swap 

max 

to 

(len-i)-th 

position

swap(array,from,from+len-1-i);

shift_down(array,from,len-1-i,0);

//always 

shiftDown 

privatefinalvoid 

build_heap(E[] 

pos=(len-1)/2;

//we 

start 

(len-1)/2, 

because 

branch'

node 

+1=leaf'

node, 

and 

all 

leaf 

already 

heap

i=pos;

=0;

shift_down(array,from,len,i);

shift_down(E[] 

len, 

pos)

tmp=array[from+pos];

index=pos*2+1;

//use 

left 

child

while(index<

len)//until 

no 

if(index+1<

len&

array[from+index].compareTo(array[from+index+1])<

0)//right 

child 

bigger

index+=1;

//switch 

right 

if(pareTo(array[from+index])<

array[from+pos]=array[from+index];

pos=index;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学反思汇报

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

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