資料結構中的三種排序(java)__插入排序

來源:互聯網
上載者:User

由於馬上要參加一個筆試,又拿出了滿是灰塵的資料結構課本,想把基本的資料類型和演算法給看一看,由於找工作是java方面,所以有意把排序的演算法用java寫一下,水平很是一般,希望自己能夠一步一個腳印,踏實走下去,如果能給大家一些啟發就更好了。 代碼全部測試過,如有瑕疵,請批評指正。


首先介紹引自百度---插入排序的基本思想是:每步將一個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。

插入排序的基本操作是:將一個資料插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為O(n^2)。是穩定的排序方法。


穩定的定義:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri=rj,且ri在rj之前,而在排序後的序列中,ri仍在rj之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。

我的理解是:

1.把需要排序的數分成兩份,第一份是有序的,第二份無序。

2.最開始可以把第一個數看成是有序,每次從第二份無序數中按順序取一個數。

3.把取得數跟有序數中的最後一個比較,如果前者小於後者,找合適位置插入。

4.迴圈步驟三,則排序結束。


java實現 (資料使用嚴蔚敏版 資料結構)

public void InsertSort(int []s){int j;for (int i = 1; i <s.length; i++) {  //從i=1開始,即認為數組第一個數為有序組if (s[i]<s[i-1]) {  int temp=s[i];//從有序數組中從後往前開始匹配,找合適的位置for ( j = i-1; j >=0&&temp<s[j]; j--) {s[j+1]=s[j];//後移,給array1[i]留出插入位置}//插入s[j+1]=temp;}}for(int i=0;i<s.length;i++){System.out.print(s[i]+" ");}}
編寫測試方法

public static void main(String[] args) {// TODO Auto-generated method stubInsertSort insertSort=new InsertSort();int array []={49,38,65,97,76,13,27,49};//數組賦值insertSort.InsertSort(array);}

列印結果是:13 27 38 49 49 65 76 97 

第二種 冒泡排序: 冒泡排序演算法的運作如下:(從後往前)
1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
3.針對所有的元素重複以上的步驟,除了最後一個。
4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
是穩定排序。
我的理解:這個比較好理解,因為很形象,就像氣泡從水底浮上來一樣,每經過一輪排序,會出現一個最大的數,直到所有的數排序完成。
java實現

public void BubbleSort(int []s){for (int i = s.length-1;i>0; i--) {for (int j = 0; j < i; j++) {if (s[j]>s[j+1]) { //前一個大於後一個int temp=s[j];//交換位置s[j]=s[j+1];s[j+1]=temp;}}}for (int i = 0; i < s.length; i++) {System.out.print(s[i]+" ");}}
主函數測試
public static void main(String[] args) {// TODO Auto-generated method stubBubbleSort bubbleSort=new BubbleSort();int array []={49,38,65,97,76,13,27,49};bubbleSort.BubbleSort(array);}

列印結果是:13 27 38 49 49 65 76 97 
第三個 快速排序 (是冒泡排序的改進) 基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以 遞迴進行,以此達到整個資料變成有序序列。
是不穩定的排序。
我的理解:採取分治思想,什麼意思呢。就是首先把資料分成兩部分,取一個中間值(樞軸),中間值左邊的每個數都比右邊的每個數小,然後對於左邊的數,再取中間數,這樣迴圈,最終把整個數組排成有序。這裡引用一個動態圖片來說明,很清楚。
java實現
public class QuickSort {public static void main(String[] args) {// TODO Auto-generated method stubint []s={49,38,65,97,76,13,27};QuickSort qs=new QuickSort();qs.QuickSort(s, 0, s.length-1);//列印for (int i = 0; i < s.length; i++) {System.out.print(s[i]+" ");}}//遞迴 排序public void QuickSort(int []s,int low,int high){if (low<high) {int middle=getMiddle(s, low, high);//通過迭代來對每一部分排序QuickSort(s, low, middle-1);QuickSort(s, middle+1, high);}}//取得無序數組的中值public int getMiddle(int []s,int low,int high){//取第一個數作為中值int temp=s[low];while(low<high){//從後往前尋找,當其值小於temp,把它交換到前邊while(low<high&&s[high]>temp) high--;s[low]=s[high];////從前往後尋找,當其值大於temp,把它交換到後邊while(low<high&& s[low]<temp) low++;s[high]=s[low];}//把中值放到應該的位置s[low]=temp;return low;}}

列印結果:13 27 38 49 65 76 97 

最後一種 選擇排序

選擇排序的解釋:對比數組中前一個元素跟後一個元素的大小,如果後面的元素比前面的元素小則用一個變數k來記住他的位置,接著第二次比較,前面“後一個元素”現變成了“前一個元素”,繼續跟他的“後一個元素”進行比較如果後面的元素比他要小則用變數k記住它在數組中的位置(下標),等到迴圈結束的時候,我們應該找到了最小的那個數的下標了,然後進行判斷,如果這個元素的下標不是第一個元素的下標,就讓第一個元素跟他交換一下值,這樣就找到整個數組中最小的數了。然後找到數組中第二小的數,讓他跟數組中第二個元素交換一下值,以此類推。

我的理解:以上說的很明白,總體上說,第一次遍曆找到最小的數,第二次遍曆找到第二小的數,以此類推。


java實現

public class SelectSort {public static void main(String[] args) {// TODO Auto-generated method stubSelectSort selectSort=new SelectSort();selectSort.SelectSort();}public void SelectSort(){int temp;//存放每次迴圈中最小的數值int []s={100,52,68,59,57};//最小數值的 位置int position=0;for (int i = 0; i <s.length; i++) {position=i;temp=s[i];//當發現有比s[i]小的,交換位置for (int j = i+1; j < s.length; j++) {if (s[j]<temp) {temp=s[j];position=j;}}//交換位置s[position]=s[i];s[i]=temp;}//列印for (int i = 0; i < s.length; i++) {System.out.print(s[i]+" ");}}}


列印結果:52 57 59 68 100 


至此,這三類排序演算法介紹完畢。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.