給出的信息太少,比如數組類型是什么?數據分布是怎樣的?給個通用的做法:把數組按順序排好,二進制找。
是升序排序。
比如一個塑料I數組,原來的順序是,9,8,7,6,5,4,3,2,1。使用()后,得到的結果是1,2,3,4,5,6,7,8,9。
如果需要改變排序,就改成降序,需要改變排序(要排序的內容,())。
選擇排序法
想
N個記錄文件的直接選擇排序可以得到n-1個直接選擇排序后的有序結果:①初始狀態:無序區為R[1...n],并且有序區域是空的。②在第一次排序中,從無序區域R[1]中選擇具有最小關鍵字的記錄R[k]..n],并且它與無序區域中的第一個記錄R[1]交換,使得R[1..1]和R[2..n]分別成為增加一條記錄的新有序區域和減少一條記錄的新無序區域。.....(3)第一次排序。
在第I個排序開始時,當前有序區域和無序區域是R[1..i-1]和R(i..n)分別為。這個排序從當前無序區中選擇關鍵字最小的記錄R[k],與無序區中的第一條記錄R交換,使R[1...I]和R分別成為增加一條記錄的新有序區和減少一條記錄的新無序區。
排序實例初始關鍵字[4938659776132749]
第一次排序后,13[38659776492749]
第二次排序后,1327[659776493849]
在第三遍排序后,132738[9776496549]
在第四遍排序后,13273849[76976549]
第五遍排序后,1327384949[976576]
第六遍排序后,132738494965[9776]
第七次排序后,13273849496576[97]
最終排名結果1327384949657697
Java實現代碼如下:
驗證了結果的正確性。
氣泡法
原則
冒泡排序算法的工作如下:比較相鄰的元素。如果第一個比第二個大,就把它們換了。對每對相鄰的元素做同樣的工作,從第一對到最后一對。此時,最后一個元素應該是最大的數字。對除最后一個元素之外的所有元素重復上述步驟。每次對越來越少的元素繼續重復上述步驟,直到沒有要比較的數字對。算法分析算法穩定性冒泡排序是將小元素前移或大元素后移。比較是兩個相鄰元素的比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我認為你贏了。;不要厭倦再次交換它們;如果兩個相等的元素不相鄰,即使通過之前的兩兩交換相鄰,此時也不會交換,所以相同元素的順序沒有改變,所以冒泡排序是一種穩定的排序算法。
Java實現代碼:
?
插入排序
插入排序的算法描述是一種簡單直觀的排序算法。它的工作原理是構造一個有序序列,在排序后的序列中從后向前掃描無序數據,找到對應的位置并插入。在插入排序的實現中,通常采用原地排序(即只有O(1)額外空間的排序),所以在從后向前掃描的過程中,需要反復地將排序后的元素逐步向后移動,為最新的元素提供插入空間。
算法描述一般來說,插入排序是通過就地在數組上實現的。具體算法描述如下:從第一個元素開始,可以認為這個元素已經排序取出下一個元素,在排序后的元素序列中從后向前掃描。如果這個元素(已排序)大于新元素,將其移動到下一個位置并重復步驟3,直到找到已排序元素小于或等于新元素的位置,然后重復步驟2-5。如果比較操作的成本大于交換操作的成本,可以采用二分搜索法方法來減少比較操作的次數。這種算法可以看作是插入排序的一種變體,稱為二分搜索法排序。
Java示例代碼如下:
殼牌石油公司排序
Hill排序通過將所有比較的元素分成幾個區域來提高插入排序的性能。這允許一個元素一次向它的最終位置邁出一大步。然后算法采取越來越小的步驟進行排序,算法的最后一步是普通的插入排序,但是到了這一步,要排序的數據就排列的差不多了(此時插入排序更快)。假設在一個按升序排序的數組的末尾有一個非常小的數據。如果使用復雜度為O(n2)的排序(冒泡排序或插入排序),可能需要n次比較和交換才能將數據移動到正確的位置。但是,希爾排序會以較大的步長移動數據,因此小數據只需幾次比較和交換就可以到達正確的位置。更好地理解Hill排序實現:將數組列在一個表中,并對列進行排序(按插入排序)。重復此過程,但每次使用更長的列。最后,整個表格只有一列。將數組轉換成表格的目的是為了更好地理解這個算法。算法本身只對原始數組進行排序(通過增加索引的步長,比如用istep_size代替I)。
例如,假設有這樣一組數字[13149433822559946523452773253910],如果我們以步長5開始排序,我們可以通過將這個列表放在一個有5列的表中來更好地描述算法。
所以它們應該是這樣的:
然后我們對每一列進行排序:當上述四行數字按順序連接在一起時,我們得到:[101473252313279433392594658245]。這時10已經移動到正確的位置,然后分3步排序:排序后變成:最后分1步排序(此時是簡單的插入排序)。
在實際使用過程中,排序的數據絕對不只是十個,而是以上的思路。其實排序只是插入排序的一種優化。
快速排序思路:從待排序的記錄序列中選擇一條記錄(通常是第一條記錄)作為支點,然后將其他關鍵字小于k1的記錄移到前面,關鍵字大于k1的記錄移到后面。結果,要排序的序列被分成兩個子表,最后在分割線的位置找到帶有關鍵字k1的記錄。算法步驟:假設要劃分的序列為r[left],R[left1],...r[right],實現上面的除法過程,可以設置兩個指針I和J,它們的初始值分別是左和右。首先將參考記錄r[left]移動到變量X中,變量X為r[left],即r[i]相當于一個空單元格,然后重復下面兩個掃描過程,直到I和J相遇。直到r[j]。key(2)i從左向后掃描,直到r[i],將r[i]移動到空單元格r[j],此時r[i]相當于空單元格。當I和J相遇時,r[i](或r[j])相當于一個空單元格,r[i]左邊所有記錄的關鍵字不大于基準記錄的關鍵字,而r[i]右邊所有記錄的關鍵字不小于基準記錄的關鍵字。最后,將基準記錄移動到r[i],并完成一個劃分過程。最后,通過遞歸調用排序函數對子表進行排序。Java示例代碼如下:
歸并排序歸并排序是一種基于歸并運算的有效排序算法。這個算法是分而治之的一個非常典型的應用。值得注意的是,歸并排序是一種穩定的排序方法。合并有序子序列以獲得完全有序的序列;也就是說,首先對每個子序列進行排序,然后對子序列段進行排序。如果兩個有序表合并成一個有序表,稱為雙向合并。歸并操作歸并操作(也叫歸并算法)是指將兩個順序序列合并成一個順序序列的方法。如果有系列(6,202,100,301,38,8,1)初始狀態:6,202,100,301,38,8,1第一次合并后:{6,202},{100,301},{8,38},{1},比較次數:3;第二次合并后:{6,100,202,301},{1,8,38},比較次數:4;第三次合并后:{1,6,8,38,100,202,301},比較次數:4;對比總數為:34411;倒數是14;算法對歸并操作的工作原理描述如下:第一步:申請一個大小為兩個排序序列之和的空間,用來存放歸并后的序列;步驟2:設置兩個指針,其初始位置分別為兩個排序序列的起始位置;第三步:比較兩個指針所指向的元素,選擇一個相對較小的元素放入合并空間,將指針移動到下一個位置重復第三步,直到一個指針超過序列的末尾,直接復制另一個序列的所有剩余元素。