這幾種排序方法分別為:冒泡排序,選擇排序,插入排序,快速排序
1.冒泡排序:
思想:簡單的說就是想辦法把一堆數據中最大的數不停地往后邊排。
代碼:
class Bubble{
// /**
// * 測試方法
// */
// public void test(int i){
// i++;
// System.out.println(i);
// }
public void sort(int arr[]){
int temp = 0;//設置這個變量的目的是為了實現數值的交換
//冒泡排序
for(int i=0;i arr[j+1]){
//交換
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
// //遍歷數組輸出最后結果
// for(int i=0;i
排序方法一般都就那幾種。像冒泡排序,直接插入排序,快速排序,簡單選擇排序,希爾排序,堆排序。其排序介紹自己看吧。
1、冒泡排序屬于穩(wěn)定排序,是一種借助“交換”進行排序的方法。首先要將第一個記錄的關鍵字和第二個記錄的關鍵字進行比較,若為逆序,則將兩個記錄交換之,然后比較第二個記錄與第三個記錄的關鍵字,以此類推,直至第n-1個記錄與第n個記錄的關鍵字進行比較為止,這一過程稱為第一趟冒泡排序,其結果使得關鍵字最大的記錄被安置在最后一個記錄的位置上;然后進行第二趟冒泡排序,對前N-1個記錄進行同樣操作;以此類推,直到在一趟排序過程中沒有進行過交換記錄的操作為止。
2、直接插入排序屬于穩(wěn)定的排序,每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。第一趟將待比較的數值與它的前一個數值進行比較,當前一數值比待比較數值大的情況下繼續(xù)循環(huán)比較,依次進行下去,進行了(n-1)趟掃描以后就完成了整個排序過程,結束該次循環(huán)。
3、快速排序屬于不穩(wěn)定排序,是對起泡排序的一種改進。它的基本思想是,通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續(xù)進行排序,以達到整個序列有序。假設待排序的序列為{R.[s],R.[s+1],…….,R.[t]},首先任意選取一個記錄,然后按下述原則從新排序記錄:將關鍵字較他小的記錄都安置在他的位置之前,將所有關鍵字較他大的記錄都安置在他的位置后面。由此可以該“樞軸”記錄最后所落的位置i作為分界線,將序列{R[s],R[s+1]…….R[t]}分割成兩個子序列{R[s],R[s+1]…..R[i-1]}和{R[i+1]……R[t]},這個過程稱作一趟快速排序。一趟快速排序的具體做法是:附設兩個指針low和high,它們的初值分別指向數組第一個數據和最后一個數據,將樞軸記錄暫存在R[0]的位置上排序過程中只作R[low]或R[high]的單向移動,直至一趟排序結束后再將樞軸記錄移至正確位置上。
4、簡單選擇排序屬于不穩(wěn)定排序,基本思想是,每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。第i趟簡單選擇排序是指通過n-i次關鍵字的比較,從n-i+1個記錄中選出關鍵字最小的記錄,并和第i個記錄進行交換。共需進行n-1趟比較,直到所有記錄排序完成為止。例如:進行第i趟選擇時,從當前候選記錄中選出關鍵字最小的k號記錄,并和第i個記錄進行交換。
5、希爾排序屬于不穩(wěn)定排序,也是一種屬插入排序類,它的基本思想是:先將整個待排記錄序列分割稱為若干個子序列分別進行直接插入排序,待整個序列中記錄“基本有序”時,再對全體記錄進行一次直接插入排序。希爾排序的一個特點是:子序列的構成不是簡單的“逐段分割”,而是將相隔某個“增量”的記錄組成一個子序列。
6、堆排序屬于不穩(wěn)定排序,它的基本思想是,先將初始文件R[1..n]建成一個大根堆,此堆為初始的無序區(qū),再將關鍵字最大的記錄R[1](即堆頂)和無序區(qū)的最后一個記錄R[n]交換,由此得到新的無序區(qū)R[1..n-1]和有序區(qū)R[n],且滿足R[1..n-1].keys≤R[n].key;由于交換后新的根R[1]可能違反堆性質,故應將當前無序區(qū)R[1..n-1]調整為堆,然后再次將R[1..n-1]中關鍵字最大的記錄R[1]和該區(qū)間的最后一個記錄R[n-1]交換,由此得到新的無序區(qū)R[1..n-2]和有序區(qū)R[n-1..n],且仍滿足關系R[1..n- 2].keys≤R[n-1..n].keys,同樣要將R[1..n-2]調整為堆。直到無序區(qū)只有一個元素為止
這兩天復習了一下排序方面的知識,現將目前比較常見的整理一下。
選擇排序選擇排序的思想是首先先找到序列中最大元素并將它與序列中最后一個元素交換,然后找下一個最大元素并與倒數第二個元素交換,依次類推。此排序很簡單,這不做多說,代碼實現如下:View Code插入排序算法流程: 1. 從第一個元素開始,該元素可以認為已經被排序
2. 取出下一個元素,在已經排序的元素序列中從后向前掃描
3. 如果該元素(已排序)大于新元素,將該元素移到下一位置
4. 重復步驟3,直到找到已排序的元素小于或者等于新元素的位置
5. 將新元素插入到下一位置中
6. 重復步驟2View Code冒泡排序依次比較相鄰的兩個數,將小數放在前面,大數放在后面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放后。然后比較第2個數和第3個數,將小數放前,大數放后,如此繼續(xù),直至比較最后兩個數,將小數放前,大數放后。至此第一趟結束,將最大的數放到了最后。在第二趟:仍從第一對數開始比較(因為可能由于第2個數和第3個數的交換,使得第1個數不再小于第2個數),將小數放前,大數放后,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。如此下去,重復以上過程,直至最終完成排序。
View Code合并排序 在介紹合并排序之前,首先介紹下遞歸設計的技術,稱為分治法。分治法的核心思想是:當問題比較小時,直接解決。當問題比較大時,將問題分為兩個較小的子問題,每個子問題約為原來的一半。使用遞歸調用解決每個子問題。遞歸調用結束后,常常需要額外的處理,將較小的問題的結果合并,得到較大的問題的答案。
合并排序算法在接近數組中間的位置劃分數組,然后使用遞歸運算對兩個一半元素構成的數組進行排序,最后將兩個子數組進行合并,形成一個新的已排好序的數組。
代碼如下:View Code快速排序 快速排序與合并排序有著很多相似性。將要排序的數組分成兩個子數組,通過兩次遞歸調用分別對兩個數組進行排序,再將已經排好序的兩個數組合并成一個獨立的有序數組。但是,將數組一分為二的做法比合并排序中使用的簡單方法復雜的多。它需要將所有小于或者等于基準元素的元素放置到基準元素前面的位置,將大于基準的元素放置到基準后面的位置。
1234
1243
1324
1342
1423
1432
2134
2143
2341
2314
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4231
4213
4312
4321
排序算法 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。
分類 在計算機科學所使用的排序算法通常被分類為: 計算的復雜度(最差、平均、和最好表現),依據串列(list)的大小(n)。一般而言,好的表現是O。
(n log n),且壞的行為是Ω(n2)。對於一個排序理想的表現是O(n)。
僅使用一個抽象關鍵比較運算的排序算法總平均上總是至少需要Ω(n log n)。 記憶體使用量(以及其他電腦資源的使用) 穩(wěn)定度:穩(wěn)定排序算法會依照相等的關鍵(換言之就是值)維持紀錄的相對次序。
也就是一個排序算法是穩(wěn)定的,就是當有兩個有相等關鍵的紀錄R和S,且在原本的串列中R出現在S之前,在排序過的串列中R也將會是在S之前。 一般的方法:插入、交換、選擇、合并等等。
交換排序包含冒泡排序(bubble sort)和快速排序(quicksort)。選擇排序包含shaker排序和堆排序(heapsort)。
當相等的元素是無法分辨的,比如像是整數,穩(wěn)定度并不是一個問題。然而,假設以下的數對將要以他們的第一個數字來排序。
(4, 1) (3, 1) (3, 7) (5, 6) 在這個狀況下,有可能產生兩種不同的結果,一個是依照相等的鍵值維持相對的次序,而另外一個則沒有: (3, 1) (3, 7) (4, 1) (5, 6) (維持次序) (3, 7) (3, 1) (4, 1) (5, 6) (次序被改變) 不穩(wěn)定排序算法可能會在相等的鍵值中改變紀錄的相對次序,但是穩(wěn)定排序算法從來不會如此。不穩(wěn)定排序算法可以被特別地時作為穩(wěn)定。
作這件事情的一個方式是人工擴充鍵值的比較,如此在其他方面相同鍵值的兩個物件間之比較,就會被決定使用在原先資料次序中的條目,當作一個同分決賽。然而,要記住這種次序通常牽涉到額外的空間負擔。
排列算法列表 在這個表格中,n是要被排序的紀錄數量以及k是不同鍵值的數量。 穩(wěn)定的 冒泡排序(bubble sort) — O(n2) 雞尾酒排序 (Cocktail sort, 雙向的冒泡排序) — O(n2) 插入排序 (insertion sort)— O(n2) 桶排序 (bucket sort)— O(n); 需要 O(k) 額外 記憶體 計數排序 (counting sort) — O(n+k); 需要 O(n+k) 額外 記憶體 歸并排序 (merge sort)— O(n log n); 需要 O(n) 額外記憶體 原地歸并排序 — O(n2) 二叉樹排序 (Binary tree sort) — O(n log n); 需要 O(n) 額外記憶體 鴿巢排序 (Pigeonhole sort) — O(n+k); 需要 O(k) 額外記憶體 基數排序 (radix sort)— O(n·k); 需要 O(n) 額外記憶體 Gnome sort — O(n2) Library sort — O(n log n) with high probability, 需要 (1+ε)n 額外記憶體 不穩(wěn)定 選擇排序 (selection sort)— O(n2) 希爾排序 (shell sort)— O(n log n) 如果使用最佳的現在版本 Comb sort — O(n log n) 堆排序 (heapsort)— O(n log n) Smoothsort — O(n log n) 快速排序 (quicksort)— O(n log n) 期望時間, O(n2) 最壞情況; 對於大的、亂數串列一般相信是最快的已知排序 Introsort — O(n log n) Patience sorting — O(n log n + k) 最外情況時間, 需要 額外的 O(n + k) 空間, 也需要找到最長的遞增子序列(longest increasing subsequence) 不實用的排序算法 Bogo排序 — O(n * n!) 期望時間, 無窮的最壞情況。
Stupid sort — O(n3); 遞回版本需要 O(n2) 額外記憶體 Bead sort — O(n) or O(√n), 但需要特別的硬體 Pancake sorting — O(n), 但需要特別的硬體 排序的算法 排序的算法有很多,對空間的要求及其時間效率也不盡相同。下面列出了一些常見的排序算法。
這里面插入排序和冒泡排序又被稱作簡單排序,他們對空間的要求不高,但是時間效率卻不穩(wěn)定;而后面三種排序相對于簡單排序對空間的要求稍高一點,但時間效率卻能穩(wěn)定在很高的水平?;鶖蹬判蚴轻槍﹃P鍵字在一個較小范圍內的排序算法。
插入排序 冒泡排序 選擇排序 快速排序 堆排序 歸并排序 基數排序 希爾排序 插入排序 插入排序是這樣實現的: 首先新建一個空列表,用于保存已排序的有序數列(我們稱之為"有序列表")。 從原數列中取出一個數,將其插入"有序列表"中,使其仍舊保持有序狀態(tài)。
重復2號步驟,直至原數列為空。 插入排序的平均時間復雜度為平方級的,效率不高,但是容易實現。
它借助了"逐步擴大成果"的思想,使有序列表的長度逐漸增加,直至其長度等于原列表的長度。 冒泡排序 冒泡排序是這樣實現的: 首先將所有待排序的數字放入工作列表中。
從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大于他的下一位,則將它與它的下一位交換。 重復2號步驟,直至再也不能交換。
冒泡排序的平均時間復雜度與插入排序相同,也是平方級的,但也是非常容易實現的算法。 選擇排序 選擇排序是這樣實現的: 設數組內存放了n個待排數字,數組下標從1開始,到n結束。
i=1 從數組的第i個元素開始到第n個元素,尋找最小的元素。 將上一步找到的最小元素和第i位元素交換。
如果i=n-1算法結束,否則回到第3步 選擇排序的平均時間復雜度也是O(n2)的。 快速排序 現在開始,我們要接觸高效排序算法了。
實踐證明,快速排序是所有排序算法中最高效的一種。它采用了分治的思想:先保證列表的前半部分。
一、插入排序(Insertion Sort)1. 基本思想:每次將一個待排序的數據元素,插入到前面已經排好序的數列中的適當位置,使數列依然有序;直到待排序數據元素全部插入完為止。
2. 排序過程: 【示例】:[初始關鍵字] [49] 38 65 97 76 13 27 49 J=2(38) [38 49] 65 97 76 13 27 49 J=3(65) [38 49 65] 97 76 13 27 49 J=4(97) [38 49 65 97] 76 13 27 49 J=5(76) [38 49 65 76 97] 13 27 49 J=6(13) [13 38 49 65 76 97] 27 49 J=7(27) [13 27 38 49 65 76 97] 49 J=8(49) [13 27 38 49 49 65 76 97] 1. Procedure InsertSort(Var R : FileType);2. //對R[1..N]按遞增序進行插入排序, R[0]是監(jiān)視哨//3. Begin4. for I := 2 To N Do //依次插入R[2],。,R[n]//5. begin6. R[0] := R; J := I - 1;7. While R[0] < R[J] Do //查找R的插入位置//8. begin9. R[J+1] := R[J]; //將大于R的元素后移//10. J := J - 111. end12. R[J + 1] := R[0] ; //插入R //13. end14. End; //InsertSort //復制代碼二、選擇排序1. 基本思想: 每一趟從待排序的數據元素中選出最?。ɑ蜃畲螅┑囊粋€元素,順序放在已排好序的數列的最后,直到全部待排序的數據元素排完。
2. 排序過程:【示例】:初始關鍵字 [49 38 65 97 76 13 27 49] 第一趟排序后 13 [38 65 97 76 49 27 49] 第二趟排序后 13 27 [65 97 76 49 38 49] 第三趟排序后 13 27 38 [97 76 49 65 49] 第四趟排序后 13 27 38 49 [49 97 65 76] 第五趟排序后 13 27 38 49 49 [97 97 76] 第六趟排序后 13 27 38 49 49 76 [76 97] 第七趟排序后 13 27 38 49 49 76 76 [ 97] 最后排序結果 13 27 38 49 49 76 76 97 1. Procedure SelectSort(Var R : FileType); //對R[1..N]進行直接選擇排序 //2. Begin3. for I := 1 To N - 1 Do //做N - 1趟選擇排序//4. begin5. K := I;6. For J := I + 1 To N Do //在當前無序區(qū)R[I..N]中選最小的元素R[K]//7. begin8. If R[J] < R[K] Then K := J9. end;10. If K I Then //交換R和R[K] //11. begin Temp := R; R := R[K]; R[K] := Temp; end;12. end13. End; //SelectSort //復制代碼三、冒泡排序(BubbleSort)1. 基本思想: 兩兩比較待排序數據元素的大小,發(fā)現兩個數據元素的次序相反時即進行交換,直到沒有反序的數據元素為止。2. 排序過程: 設想被排序的數組R[1..N]垂直豎立,將每個數據元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R,凡掃描到違反本原則的輕氣泡,就使其向上"漂浮",如此反復進行,直至最后任何兩個氣泡都是輕者在上,重者在下為止。
【示例】:49 13 13 13 13 13 13 1338 49 27 27 27 27 27 2765 38 49 38 38 38 38 3897 65 38 49 49 49 49 4976 97 65 49 49 49 49 4913 76 97 65 65 65 65 6527 27 76 97 76 76 76 7649 49 49 76 97 97 97 97 1. Procedure BubbleSort(Var R : FileType) //從下往上掃描的起泡排序//2. Begin3. For I := 1 To N-1 Do //做N-1趟排序//4. begin5. NoSwap := True; //置未排序的標志//6. For J := N - 1 DownTo 1 Do //從底部往上掃描//7. begin8. If R[J+1]= X) And (I < J) Do7. begin8. J := J - 1 //從右向左掃描,查找第1個小于 X的元素//9. If I < J Then //已找到R[J] 〈X//10. begin11. R := R[J]; //相當于交換R和R[J]//12. I := I + 113. end;14. While (R <= X) And (I < J) Do15. I := I + 1 //從左向右掃描,查找第1個大于 X的元素///16. end;17. If I X //18. begin R[J] := R; //相當于交換R和R[J]//19. J := J - 120. end21. Until I = J;22. R := X //基準X已被最終定位//23. End; //Parttion //復制代碼1. Procedure 。
1.解排列組合的應用題,通常有以下幾種途徑
(1)以元素為主體,即先滿足特殊元素的要求,再考慮其他元素;(2)以位置為主體,即先滿足特殊位置的要求,再考慮其他元素;(3)先不考慮附加條件,計算出排列或組合數,再減去不合要求的排列或組合數。
2.典型題解法
相鄰問題——捆綁法;相離問題——插空法;多元問題——分類法;標號排位問題——分步法;定序問題——消序法;多排問題——單排法;至少問題——間接法;選排問題——先取后排法;組排問題——先組后排法。
3.總原則
(1)弄清事件的情景:首先搞清有無“順序”要求,有用Amn(A右上m右下n),反之用Cmn(C右上m右下n);其次弄清目標的實現,是分步還是分類達到,一個復雜問題往往是分步和分類交織在一起的;最后看元素是否重復。
(2)掌握“雙向”解題途徑,即“正面湊”與“反過來剔”。
(3)重視一題多解,提高分析能力。
聲明:本網站尊重并保護知識產權,根據《信息網絡傳播權保護條例》,如果我們轉載的作品侵犯了您的權利,請在一個月內通知我們,我們會及時刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學習鳥. 頁面生成時間:3.306秒