Java實現排序演算法 二

2021-04-19 07:07:59 字數 3627 閱讀 2747

為了便於管理,先引入個基礎類:

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...