為了便於管理,先引入個基礎類:
package
algorithms;
/***
@author
yovn**/
public
abstract
class
sorter
<
e extends
comparable
<
e>>
protected
final
void
swap(e array,
intfrom ,
intto)
}一 插入排序
該演算法在資料規模小的時候十分高效,該演算法每次插入第k+1到前k個有序陣列中乙個合適位置,k從0開始到n-1,從而完成排序:
package
algorithms;
/***
@author
yovn
*/public
class
insertsorter
<
e extends
comparable
<
e>>
extends
sorter
<
e>
else
break;}
array[j]
=tmp;}}
}二 氣泡排序
這可能是最簡單的排序演算法了,演算法思想是每次從陣列末端開始比較相鄰兩元素,把第i小的冒泡到陣列的第i個位置。i從0一直到n-1從而完成排序。(當然也可以從陣列開始端開始比較相鄰兩元素,把第i大的冒泡到陣列的第n-i個位置。i從0一直到n-1從而完成排序。)
package
algorithms;
/***
@author
yovn**/
public
class
bubblesorter
<
e extends
comparable
<
e>>
extends
sorter
<
e>}}
}public
final
void
bubble_up(e array,
intfrom,
intlen)}}
}@override
public
void
sort(e array,
intfrom,
intlen)
else}}
三,選擇排序
選擇排序相對於冒泡來說,它不是每次發現逆序都交換,而是在找到全域性第i小的時候記下該元素位置,最後跟第i個元素交換,從而保證陣列最終的有序。
相對與插入排序來說,選擇排序每次選出的都是全域性第i小的,不會調整前i個元素了。
package
algorithms;
/***
@author
yovn**/
public
class
selectsorter
<
e extends
comparable
<
e>>
extends
sorter
<
e>
}swap(array,i,**allest);}}
}四 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排序的時候採用該增量序列
package
algorithms;
/***
@author
yovn
*/public
class
shellsorter
<
e extends
comparable
<
e>>
extends
sorter
<
e>
for(
intdelta
=value;delta
>=
1;delta
=(delta+1
)/2-
1)}}
private
final
void
modify_insert_sort(e array,
intfrom,
intlen,
intdelta)
else
break;}
array[j]
=tmp;}}
}五 快速排序
快速排序是目前使用可能最廣泛的排序演算法了。
一般分如下步驟:
1)選擇乙個樞紐元素(有很對選法,我的實現裡採用去中間元素的簡單方法)
2)使用該樞紐元素分割陣列,使得比該元素小的元素在它的左邊,比它大的在右邊。並把樞紐元素放在合適的位置。
3)根據樞紐元素最後確定的位置,把陣列分成三部分,左邊的,右邊的,樞紐元素自己,對左邊的,右邊的分別遞迴呼叫快速排序演算法即可。
快速排序的核心在於分割演算法,也可以說是最有技巧的部分。
package
algorithms;
/***
@author
yovn**/
public
class
quicksorter
<
e extends
comparable
<
e>>
extends
sorter
<
e>
private
final
void
q_sort(e array,
intfrom,
intto)
private
intpartion(e array,
intfrom,
intto,
intpivot)
while
(from
<
to&&
array[to].compareto(tmp)
>=
0)to--;
if(from
<
to)}
array[from]
=tmp;
return
from;
}private
intselectpivot(e array,
intfrom,
intto)
}
排序演算法java實現
以下文章 亦風亦塵的空間http blog.csdn.net lschou520 archive 2008 10 29 3176422.aspx 插入排序 package org.rut.util.algorithm.support import org.rut.util.algorithm.sor...
java實現排序演算法
四種排序方式 1.氣泡排序 2.插入排序 3.快速排序 4.歸併排序 author zhaijian public class sorts bubblesort a insertsort a quicksort a mergesort a print a 氣泡排序 兩個迴圈,第乙個迴圈是指要排序的總...
排序演算法java實現
選擇排序類 交換排序類 歸併排序類 附工具類 直接插入排序public class insertionsorter a j tmp arrayutils.printarray a public static super anytype void sort anytype a,int left,int...