[Java教程]16.數組的排序算法

Java教程專欄:https://blog.csdn.net/qq_41806966/category_9929686.html

hello,I'm shendi

本節學習如何讓 int 類型數組排序


目錄

 

排序

冒泡排序

選擇排序

插入排序

睡眠排序

練習


排序

排序是指將一堆元素按照一定的規則進行排列.

例如一堆數字,我們可以由大到小或者由小到大進行排序

 之前學過數組,現在我們就來學習一下 int 類型的數字進行排序(由大到小,由小到大)

---不會排序的等價於沒學過數組?

排序算法有很多種,例如冒泡排序,選擇排序等,這裏我抽幾個來講解


冒泡排序

什麼是冒泡排序?

按照數 從小到大 進行排序的話, 冒泡排序就是 從第一個元素開始,和後面那個元素進行比較,看後面的是否大於我,大於我們就換位置.

然後第二個元素和第三個比,第三個和第四個,這樣兩個相鄰的元素進行比較.

經過一次循環數組後,我們可以把最大的數給找出來

例如 現有數組 [1,4,3,2,5]

冒泡排序是兩個相鄰元素進行比較,我們要從小到大排序,所以第一次判斷 1 和 4.

1 < 4,所以位置不變,第二次就是判斷 4 和 3.

4 > 3 所以我們要讓這兩個元素位置互換一下, 所以現在數組變爲

[1,3,4,2,5]

接着在判斷 4 和 2.

4 > 2,所以我們也需要把位置進行移動,現在數組變爲

[1,3,2,4,5]

最後 4 和 5進行比較.

4 < 5,所以不變,一次循環完成,我們成功獲取到了最大的那個數--5

一次循環數組可以找到最大的數,那麼第二次是不是找到第二大的數? 根據這個思想,實現的代碼就是冒泡排序代碼了

 

第二次數組排序, 1 和 3 比較 1 < 3,不做操作

3 和 2 比較, 3 > 2 移動一下位置,數組變爲

[1,2,3,4,5] 現在已經排序好了,但是我們的程序是無法知道數組是否是排序的,所以還會做多餘的動作(沒辦法的事情)

然後3和4比較,4和5比較, 然後第三次循環,第四次...

畫張圖就是這樣的

正常的冒泡排序算法代碼如下

int[] arr = {1,3,2,4,5,7,6};
for (int i = 0;i < arr.length - 1;i++) {
    for (int j = 0;j < arr.length - 1;j++) {
        if (arr[j] > arr[j + 1]) {
			int temp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = temp;
		}
    }
}

我們會發現上面代碼有很多重複動作,我們優化一下,編寫成代碼如下

上面的函數既可以從大到小排序也可以從小到大排序,而且比之前的高效.


選擇排序

選擇排序是最直觀的一種排序算法.

簡單地說,就是循環,找到最大/最小的那個數,和第一個位置進行交換,然後找第二個,第三個..

例如 現有數組 [6,5,4,3,2,1]

我們從小到大進行排序,使用選擇排序的話

先判斷6 是否大於 5 大於則記錄一下 5 的 位置,

然後 5 大於 4,將之前記錄的位置變爲4的位置

4>3,記錄3的位置,3>2,記錄2的位置,2>1,記錄1的位置

最後將 1 的位置換到位置 0(數組的第一個位置),然後6就到最後去了

現在的數組內容爲 [1,5,4,3,2,6]

接下來就是判斷5 是否 大於 4,大於記錄4的位置...記錄3位置,2位置

2<6 所以不用將位置替換爲6. 也就是第二小的是 2,所以將2的位置替換到位置 1

現在數組內容爲 [1,2,4,3,5,6]

然後接下來就是判斷 4 和 3 ,4 > 3 記錄 3 位置,然後3 < 5 不記錄, 3< 6 不記錄,第三小的是3.

現在數組內容爲[1,2,3,4,5,6]

現在已經完成排序,但是還會進行操作, 從4開始,判斷 4 是否大於 5,4 是否大於 6...不做操作

畫張圖就是這樣的

選擇排序的一般代碼如下

int[] arr = {6,5,4,3,2,1};
int minIndex = 0;
for (int i = 0;i < arr.length - 1;i++) {
    minIndex = i;
    for (int j = i;j < arr.length;j++) {
        if (arr[minIndex] > arr[j]) {
            minIndex = j;
        }
    }
    if (minIndex != i) {
        int temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
}

插入排序

插入排序通俗一點講就是將數抽出來, 然後判斷 前一個/後一個 是否 大於/小於 自己,是就將 前一個/後一個 換到自己的位置,然後將自己的位置往前/後 移,然後再判斷...直到條件不成立爲止

先畫一張簡單的圖

可以很容易看出此排序的原理,就是先將當前數保存起來,然後判斷當前數是否大於之前/之後那個數...

代碼如下


除了以上幾種排序外還有很多排序,這裏在列舉一個奇葩的排序(知道就好了,千萬不要用這個排序)

睡眠排序

後面我們學到線程會知道什麼是睡眠,現在只要知道,睡眠就是讓程序指定時間內不運行 就可以了

僅供娛樂

既然我們的數組爲 int 類型,並且目的是排序,那麼我們用睡眠的方法也可以進行排序(從理論上講是沒有問題的,但是間隔太近就會出問題)

睡眠排序可以 從小到大排序(只能這樣)

具體思路就是, 每一個數字都是一個元素(比作一個人), 數字大小決定了這個人睡多久, 這樣,我們只要讓這個人在睡眠醒來後立馬說出自己的數字就可以了.

代碼如下

 

運行結果

練習

寫一個自己專用的 數組 排序 工具類, 不僅僅有 int 數組的排序,也可以有字母(a-z,A-Z)...

下一節我們來實戰一下,鞏固之前的知識,完成第一個看得過去的小程序,猜拳.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章