java排序大全文档格式.docx
《java排序大全文档格式.docx》由会员分享,可在线阅读,更多相关《java排序大全文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
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'
s
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
a
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;