程式設計師那些必須掌握的排序演算法一

2021-10-02 03:15:14 字數 4426 閱讀 6733

現在的it行業並不像以前那麼好混了,從業人員過多,導致初級程式設計師過剩,這也間接導致了公司的招聘門檻越來越高,要求程式設計師掌握的知識也越來越多。

演算法也是乙個爭論了很久的話題,程式設計師到底該不該掌握演算法?不同的人有不同的答案,而事實上,很多公司都對演算法有一定的要求,有些公司直接在面試的時候便會要求面試者手寫演算法題。這就對程式設計師的技術要求產生了很大的考驗,所以面對如今的大環境,我們必須掌握演算法,才能在今後的工作中佔據一席之地。

那麼接下來,我就簡單介紹一下幾個排序演算法,希望對你們有所幫助。

1.氣泡排序

氣泡排序(bubble sort),是一種較簡單的排序演算法。

它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從a到z)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。

這個演算法的名字由來是因為越大的元素會經由交換慢慢「浮」到數列的頂端(公升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名「氣泡排序」。

演示:**如下:

@test

public void bubblesort() ;

// 統計比較次數

int count = 0;

// 第一輪比較

for (int i = 0; i < arr.length - 1; i++)

count++;}}

system.out.println(arrays.tostring(arr));

system.out.println("一共比較了:" + count + "次");}1

2345

6789

1011

1213

1415

1617

1819

2021

執行結果:

[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

一共比較了:105次12

這段**相信大家都能夠寫出來,一般氣泡排序也就是這樣寫。但是這段程式有個缺點,就是當排序過程中已經將陣列元素排序完成,但此時它仍然會去比較,這就做了無用功了,所以我們可以通過乙個boolean變數來優化這段代,上面的程式中我們已經得出了比較次數為105次。

優化**:

@test

public void bubblesort() ;

// 統計比較次數

int count = 0;

for (int i = 0; i < arr.length - 1; i++)

count++;

}if(flag)

}system.out.println(arrays.tostring(arr));

system.out.println("一共比較了:" + count + "次");}1

2345

6789

1011

1213

1415

1617

1819

2021

2223

24執行結果:

[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

一共比較了:95次12

我們首先在開始迴圈時定義了乙個boolean變數為true,然後如果元素之間進行了交換,就將值置為false。所以,我們就可以通過這個boolean變數來判斷是否有元素進行了交換。如果boolean變數為true,則證明沒有元素進行交換,那麼久說明此時的陣列元素已經完成排序,那麼跳出外層迴圈即可,否則就繼續排序。通過結果也可以看出,比較次數確實是減少了很多。

2.選擇排序

選擇排序(selection sort)是一種簡單直觀的排序演算法。它的工作原理是:第一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的資料元素的個數為零。選擇排序是不穩定的排序方法。

演示:**如下:

@test

public void selectionsort() ;

for (int i = 0; i < arr.length - 1; i++)

}// 此時已經找到最小元素的下標

// 將最小元素與前面的元素交換

int temp = arr[index];

arr[index] = arr[i];

arr[i] = temp;

}system.out.println(arrays.tostring(arr));}1

2345

6789

1011

1213

1415

1617

18執行結果:

[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

1實現也非常的簡單,首先在外迴圈裡定義了乙個index變數儲存i的值,這是為了避免重複地比較,因為在每一輪的比較結束後,前i個元素是已經排好序的,所以無需再次比較,只需從i開始即可。後面的比較都是基於index位置的元素進行比較,倘若比較完後index位置的元素是最小值,那就無需交換,不動即可。而如果找到了比index位置的元素更小的元素,那就將該元素的索引賦值給index,然後繼續比較,直到比較完成,比較完成之後得到的index即為陣列中的最小值,那此時只需要將index位置的元素和i位置的元素交換即可。

3.插入排序

插入排序(insertion sort)是一種簡單直觀且穩定的排序演算法。如果有乙個已經有序的資料序列,要求在這個已經排好的資料序列中插入乙個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法——插入排序法,插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為o(n^2)。是穩定的排序方法。插入演算法把要排序的陣列分成兩部分:第一部分包含了這個陣列的所有元素,但將最後乙個元素除外(讓陣列多乙個空間才有插入的位置),而第二部分就只包含這乙個元素(即待插入元素)。在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中。

插入排序的基本思想是:每步將乙個待排序的記錄,按其關鍵碼值的大小插入到前面已經排序的陣列中的適當位置上,直到全部插入完為止。

演示:**如下:

@test

public void insertionsort() ;

for (int i = 1; i < arr.length; i++)

arr[insertindex + 1] = insertvalue;

}system.out.println(arrays.tostring(arr));}1

2345

6789

1011

1213

1415

16執行結果:

[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

1那麼在這裡,因為陣列元素我們並不確定,所以只能將陣列的第乙個元素看成是乙個有序的序列,所以從陣列的第二個元素開始才是我們需要去尋找插入位置的元素。所以外層迴圈從1開始,然後將arr[i],也就是當前的第二個元素先儲存起來,然後找到待插入元素的前乙個元素下標,也就是i-1,此時通過乙個while迴圈去比較。

當insertindex小於0時應該退出迴圈,因為此時已經與前面的所有元素比較完畢。在比較的過程中,如果待插入元素小於前乙個元素,就將前乙個元素後移,也就是將前乙個元素的值直接賦值給待插入元素位置。因為在最開始已經將待插入元素進行了儲存,所以只需將待插入元素的值賦值給它的前乙個元素即可。因為在while迴圈中insertindex執行了自減操作,所以它的前乙個元素下標應為insertindex + 1。而如果待插入的元素值大於前乙個元素,那麼就不會進入while迴圈,這樣insertindex + 1之後的位置仍然是自己所在的位置,所以賦值後值不改變,後面的操作以此類推。

演示:動畫如果沒有看懂,我這裡再貼幾張靜態圖:

**實現:

@test

public void shellsort() ;

for (int gap = arr.length / 2; gap > 0; gap /= 2) }}

}system.out.println(arrays.tostring(arr));}1

2345

6789

1011

1213

1415

1617

1819

20執行結果:

[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

1那麼在上面的程式段中,陣列長度為15,所以在第一輪,陣列被分為了15 / 2 = 7個小組,然後分別對每個小組的元素進行遍歷。在第一輪中小組之間的元素間隔都為7,所以分成的小組數其實也就是元素之間的間隔。接著就可以對每個小組的元素進行比較,然後進行交換,接下來以此類推。

推薦閱讀

程式設計師必須掌握的排序演算法

氣泡排序 bubble sort 是一種較簡單的排序演算法。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序 如從大到小 首字母從a到z 錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。這個演算法的名字由來是因為越大的元素會...

程式設計師必須掌握的六種基本排序演算法

說起排序,可能很多程式設計師多會想起冒泡和選擇,這兩種是最基本的排序,也最容易實現,但是當我們需要對海量資料進行排序時,這幾種演算法是否依然適合呢?沒錯,他們的時間複雜度是最不起眼的,那麼我們應該如何來提高效率呢?這裡整理了六種排序演算法,時間的優越性能由低到高!1.氣泡排序 氣泡排序 演算法 每一...

程式設計師必須掌握的六種基本排序演算法

說起排序,可能很多程式設計師多會想起冒泡和選擇,這兩種是最基本的排序,也最容易實現,但是當我們需要對海量資料進行排序時,這幾種演算法是否依然適合呢?沒錯,他們的時間複雜度是最不起眼的,那麼我們應該如何來提高效率呢?這裡整理了六種排序演算法,時間的優越性能由低到高!1.氣泡排序 氣泡排序 演算法 每一...