JAVA高階排序

2021-08-18 10:36:00 字數 2631 閱讀 2407

高階排序-------希爾排序

原理:將無序陣列分割為若干個子串行,子串行不是逐段分割的,而是相隔特定的增量的子串行,對各個子串行進行插入排序;然後再選擇乙個更小的增量,再將陣列分割為多個子串行進行排序......最後選擇增量為1,即使用直接插入排序,使最終陣列成為有序。

增量:希爾排序通過加大排序中元素之間的間隔,並在這些有間隔的元素中進行插入排序,從而使資料項能大跨度地移動。當這些資料項排過一趟序後,希爾排序演算法減小資料項的間隔再進行排序,依次進行下去。進行這些排序時資料項之間的間隔被稱為增量。

比如:採用3*h+1增量,當有十個數時,最大增量跨度為4

4為增量排序0,4,8號資料項

當對0、4、8號資料項完成排序之後,演算法向右移一步,對1、5、9號資料項進行排序。這個排序過程持續進行,直到所有的資料項都已經完成了4增量排序,也就是說所有的間隔為4的資料項之間都已經排列有序。

在完成以4為增量的希爾排序之後,陣列可以看成是由4個子陣列組成(0,4,8),(,1,5,9),(2,6,)和(3,7),這四個子陣列內分別是完全有序的。

減小間隔:當進行過第一趟排序後,在制定間隔位置上的數已經有序了,這時應減小間隔繼續排序,直到間隔變成1

根據上訴增量公式,再每次完成一次排序後,用公式h=(h-1)/3來減小間隔

例項:先初始化跨度h = 1,通過while 迴圈來獲取最大跨度

int

h =

1;//

初始化跨度

//設定跨度,將陣列分成若干組

while

(h <=

arr.

length/3

)while迴圈中的判斷來控制迴圈的結束,當跨度小於1的時候表示排序完成,迴圈結束

while 

(h>0)

arr[inner] = temp

;   

}   

//上述for迴圈跳出來之後,整個陣列中,被分成的若干小陣列已經有序了

h = (h - 1)/

3;//調整陣列間隔,直到陣列間隔小於1時,排序完成跳出while迴圈

}

高階排序------快速排序

快速排序分三個基本步驟

1、  把陣列或者子陣列劃分成左邊(較小的關鍵字)的一組和右邊(較大的關鍵字)的一組

2、  呼叫自身對左邊的一組進行排序

3、  再次呼叫自身對右邊的一組進行排序

經過一次劃分之後,所有在左邊子陣列的資料項都小於在右邊子陣列的資料項,只要對左邊子陣列和右邊子陣列分別進行排序,整個資料就是有序的了,如何對子陣列進行排序,通過遞迴的呼叫排序演算法自身就可以。

遞迴呼叫排序子陣列

選擇樞紐(三資料項取中)

partitionin()方法獲取樞紐

選擇具體的乙個資料項的關鍵字的值作為樞紐:稱這個資料項為pivot(樞紐)

可以選擇任意乙個資料項作為樞紐,一般可以選擇帶劃分的子陣列最右端的資料作為樞紐,但是會有一種情況(已經有序,或者最右端的數值最大),這樣等於是進行一次排序後,陣列還是乙個,與其他排序相比體現不出來,因此,我們一般取陣列或者子陣列的三個值進行比較,選取中間值作為樞紐。

private int 

medianof3

(int

left

, int

right)

if (

arr[left] >

arr[right])

if (

arr[left] >

arr[center])

swap(center,

right - 1)

;     return arr

[right-1]

;}

交換樞紐位置

獲取第一次劃分後,關鍵字應停放的位置

private int 

partitionin

(int

left

, int

right

, int

pivot)

else

}swap(leftptr,

right - 1)

;    return leftptr

;}

由於中值劃分要求至少含有四個資料項,所以不能應用於只有兩個或者三個資料項的子陣列,所以,當子陣列中只有乙個資料項時方法立即返回,有兩個資料項時,如果需要則交換這兩個資料項,有三個資料項時對三個資料項進行排序。

private void 

manulsort

(int

left

, int

right)

if (size == 2)

}else

if (

arr[left] >

arr[right])

if (

arr[right -

1] >

arr[right])

}}

快速排序總的呼叫方式

private void  

recquicksort

(int

left

,int

right)

else

}

氣泡排序高階 雞尾酒排序(java實現)

雞尾酒排序也叫雙向氣泡排序,是對氣泡排序的一種優化。氣泡排序可以參照我上篇博文,對氣泡排序有乙個詳細的描述。在氣泡排序的基礎上,我們在外迴圈中再新增乙個內迴圈。那麼現在就有兩個內迴圈,第乙個內迴圈尋找最大值,而且依次從後往前放置在陣列中,第二個內迴圈尋找最小值,依次從前往後放置在陣列中。所以此時外迴...

Java高階知識 快速排序演算法分析

本篇文章將摘自前輩的總結 白話經典演算法系列之六 快速排序 快速搞定 總的說來,要直接默寫出快速排序還是有一定難度的,因為本人就自己的理解對快速排序作了下白話解釋,希望對大家理解有幫助,達到快速排序,快速搞定。快速排序是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略...

高階排序 希爾排序

希爾排序 實際上是基於插入排序的,在插入排序中相比較的是相鄰的兩個元素,但是如果乙個很小的數在陣列的最右端,而他本應該是在最左端的,這樣的話所有中間的元素都要向右移動一位,並且執行了n次。希爾排序就是首先對大跨度的元素做比較並且進行移動,這樣的久相對有序了,再在這個基礎上進行普通的插入排序,效率就會...