高階排序-------希爾排序
原理:將無序陣列分割為若干個子串行,子串行不是逐段分割的,而是相隔特定的增量的子串行,對各個子串行進行插入排序;然後再選擇乙個更小的增量,再將陣列分割為多個子串行進行排序......最後選擇增量為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 intmedianof3
(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 voidrecquicksort
(int
left
,int
right)
else
}
氣泡排序高階 雞尾酒排序(java實現)
雞尾酒排序也叫雙向氣泡排序,是對氣泡排序的一種優化。氣泡排序可以參照我上篇博文,對氣泡排序有乙個詳細的描述。在氣泡排序的基礎上,我們在外迴圈中再新增乙個內迴圈。那麼現在就有兩個內迴圈,第乙個內迴圈尋找最大值,而且依次從後往前放置在陣列中,第二個內迴圈尋找最小值,依次從前往後放置在陣列中。所以此時外迴...
Java高階知識 快速排序演算法分析
本篇文章將摘自前輩的總結 白話經典演算法系列之六 快速排序 快速搞定 總的說來,要直接默寫出快速排序還是有一定難度的,因為本人就自己的理解對快速排序作了下白話解釋,希望對大家理解有幫助,達到快速排序,快速搞定。快速排序是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略...
高階排序 希爾排序
希爾排序 實際上是基於插入排序的,在插入排序中相比較的是相鄰的兩個元素,但是如果乙個很小的數在陣列的最右端,而他本應該是在最左端的,這樣的話所有中間的元素都要向右移動一位,並且執行了n次。希爾排序就是首先對大跨度的元素做比較並且進行移動,這樣的久相對有序了,再在這個基礎上進行普通的插入排序,效率就會...