日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java常用的八种排序算法与代码实现

發布時間:2024/9/30 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java常用的八种排序算法与代码实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Java的時候,對于排序的應用需要熟練的掌握,這樣才能夠確保Java學習時候能夠有扎實的基礎能力。那Java有哪些排序算法呢?本文小千就來詳細說說Java經典的8種排序算法。

經典的排序算法有八種,分別為:

? 冒泡排序

? 選擇排序

? 插入排序

? 歸并排序

? 希爾排序

? 快速排序

? 堆排序

? 基數排序

其中冒泡排序、選擇排序、插入排序稱為三大基本排序。

雖然這三大基本排序算法時間復雜度都是O(n2),但是其實細細討論之下,還是有各自的特點的。

冒泡排序

冒泡排序法的思路

基本思路:

假設我們需要進行升序排列

進行N輪的比較,每一輪將相鄰的兩個元素依次比較,根據大小進行交換,每輪比較結束后,將最大的元素依次‘冒’到數組的末尾,經過幾輪比較后,數組就會呈現有序的狀態。

圖解:

假設對5個元素進行冒牌排序,先準備5個隨機元素:

1)第一輪中,將第一個元素(10)與相鄰的元素(20)進行比較,因為20比10大所以無需進行交換。再將第二個元素(20)與相鄰的元素(5)比較,因為20比5大,所以需要往上‘冒’,因此需要與5進行交換。

接著將第三個元素(20)與相鄰的元素進行比較,這樣經過與14和1的比較之后,因為20最大,所以被冒到了最后的位置。

2)后面每輪都按照此方法進行比較,但是需要注意,此后的每一輪都需要比前一輪少比較一次,因為前面已經確定了最大元素的位置,為了提高性能,可以不用再和后面確定了位置的元素進行比較。

3)由此可以確定,當數組的長度為N時,需要比較的輪數為N-1輪。每輪中從第一個元素開始相鄰元素兩兩進行比較,第一輪需要比較N-1次,第2輪需要比較N-2次,依次類推,實現整體排序。

冒泡排序法的代碼實現

? 首先通過一個外層的for循環確定比較的輪數,循環元素數量-1輪。

? 內部通過一個for循環實現每輪的兩兩元素比較的效果。每輪需要比較的次數都會比上一輪減少一次,通過j

? 元素兩兩比較通過array[j] > array[j+1]來實現。

冒泡排序法優化

以上的冒泡排序法還有優化的空間。因為如果一個數組已經是完全有序的情況下,冒泡排序法仍然會進行逐輪的比較,這無疑是浪費性能的行為。因此我們可以確定,當冒泡的比較中,有一輪如果沒有發生交換,則可以確定當前數組已經完全有序,后面的輪數完全不必在進行。故做以下的調整:

通過定義一個標識符isSort,如果有一輪沒有發生任何交換,則isSort就會為true,下次直接break,后面的輪數就不用再進行比較了。

選擇排序

選擇排序的思路

基本思路:

選擇排序和冒泡排序不同,選擇排序會通過一輪比較,選出最小的那個元素的下標,然后和第一個元素進行交換,這樣第一個元素的位置就可以確定了。

第二輪如法炮制,從第二個元素開始依次比較,選出最小的元素的下標,和第二個元素交換位置,這樣第二小的元素位置就確定了。

后面依次類推,直到整個數組呈現有序狀態。

選擇排序法的代碼實現

? 選擇排序比較的輪數和冒泡排序比較的輪數是一樣的

? K表示當前最小值的下標,當前是第幾輪,k就先代表第幾個元素的下標,然后依次和后面的元素進行比較,如果發現比k位置元素小的元素時,改變k的下標,這樣一輪過后k代表的位置就是本輪最小的元素,和i進行交換即可

? 如果一輪過后k==i,則說明i本來就是最小的元素,則無需交換提高性能。

插入排序

插入排序的思路

基本思路

假設一個數組已經基本有序,則這個時候插入排序就是一個不錯的選擇。插入排序是先保證左邊元素是基本有序的,然后將后面的元素依次和左邊元素進行比較,如果比較到一個比自己小的元素時就可以停止比較了,因為左邊已經呈現有序狀態,找到比自己小的元素時,就不用再往后比較了。

插入排序的代碼實現

? 插入排序的輪數和冒泡排序一樣,但是i從1開始,因為我們假設第一個元素已經是呈現有序狀態了。

? 內部循環依次從當前位置開始,和前面元素進行比較,如果找到了比自己小的元素,則停止比較,直接退出本輪比較,進行下一輪比較

總結

? 雖然三種排序法的時間復雜度都是O(N2),但是不同的場景還是會有不同的性能差異。

? 冒泡排序法是性能最差的算法,正式運用中,基本不會用冒泡排序法進行排序。

? 選擇排序將交換次數降到最低,但是比較次數仍然很大。當數據量小,并且交換耗時相對于比較耗時更多的情況下,選擇排序是個不錯的選擇。

? 基本有序的情況下,插入排序是最好的選擇,但是如果數據基本逆序的情況下,插入排序的性能和冒泡排序就基本一樣了。

? 從平均情況下來看,插入排序性能會比選擇排序略好一些。

以上就是小千整理的Java經典的八種排序算法,希望對學習Java的小伙伴有幫助。想了解更多Java知識,歡迎關注小千,后期會繼續分享Java知識。

本文來自千鋒教育,轉載請注明出處。

總結

以上是生活随笔為你收集整理的Java常用的八种排序算法与代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。