一種用Java實現(xiàn)的直接選擇排序算法
大家都學(xué)習(xí)過數(shù)據(jù)結(jié)構(gòu),都知道各種各樣的排序方法,比如冒泡排序,選擇排序,堆排序,歸并排序等等,我學(xué)習(xí)的教材是C語言版的,今天處于好奇,寫了一個用Java語言實現(xiàn)的直接選擇排序的程序,與大家分享一下。
直接選擇排序的思想是;
n個記錄的文件的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果:
①初始狀態(tài):無序區(qū)為R[1..n],有序區(qū)為空。
②第1趟排序
在無序區(qū)R[1..n]中選出關(guān)鍵字最小的記錄R[k],將它與無序區(qū)的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變?yōu)橛涗泜€數(shù)增加1個的新有序區(qū)和記錄個數(shù)減少1個的新無序區(qū)。
……
③第i趟排序
第i趟排序開始時,當(dāng)前有序區(qū)和無序區(qū)分別為R[1..i-1]和R[i..n](1≤i≤n-1)。該趟排序從當(dāng)前無序區(qū)中選出關(guān)鍵字最小的記錄R[k],將它與無序區(qū)的第1個記錄R[i]交換,使R[1..i]和R[i+1..n]分別變?yōu)橛涗泜€數(shù)增加1個的新有序區(qū)和記錄個數(shù)減少1個的新無序區(qū)。
這樣,n個記錄的文件的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果。
用Java實現(xiàn)的代碼如下:











































































3.6,7.4,2.1,3.3,2.0
排序后:
2.0,2.1,3.3,3.6,7.4
(1)關(guān)鍵字比較次數(shù)
無論文件初始狀態(tài)如何,在第i趟排序中選出最小關(guān)鍵字的記錄,需做n-i次比較,因此,總的比較次數(shù)為:
n(n-1)/2=0(n2)
(2)記錄的移動次數(shù)
當(dāng)初始文件為正序時,移動次數(shù)為0
文件初態(tài)為反序時,每趟排序均要執(zhí)行交換操作,總的移動次數(shù)取最大值3(n-1)。
直接選擇排序的平均時間復(fù)雜度為O(n2)。
(3)直接選擇排序是一個就地排序
(4)穩(wěn)定性分析
直接選擇排序是不穩(wěn)定的
【例】反例[2,2,1]
posted on 2007-04-16 11:51 我為J狂 閱讀(4081) 評論(8) 編輯 收藏 所屬分類: Java算法