基礎演算法 氣泡排序,插入排序,選擇排序

2021-10-06 05:10:30 字數 3938 閱讀 9632

本文來在極客時間-王爭老師的《資料結構與演算法之美》

每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關係要求。如果不滿足就讓它倆互換。一次冒泡會讓至少乙個元素移動到它應該在的位置,重複 n 次,就完成了 n 個資料的排序工作。

例如:要對一組資料 4,5,6,3,2,1,從小到大進行排序。第一次冒泡操作的詳細過程如下:

假設要對n個元素進行氣泡排序,執行的步驟如下:

比較相鄰的元素。如果前者》後者,則交換兩者的位置。

按順序對每一組相鄰元素做步驟1的工作,直到結束(需要執行了n-1次比較工作)。

以此類推,執行n-1次的步驟2,即可完成氣泡排序。

package cn.hgy.data.algorithm;

package cn.hgy.data.algorithm;

/** * 氣泡排序

** 演算法介紹:遍歷待排序的數,每次選出最大的數新增到合適的位置

* 時間複雜度:最優-o(n),最壞-o(n^2),

*

*

* @author guoyu.huang

* @version 1.0.0

*/public

class

bubblesort

;int

sortarrays =

sort

(arrays)

;for

(int i =

0; i < sortarrays.length; i++)}

/** * 排序

*

*     兩個優化點:

* 1. 如果進行一輪的比較遍歷後,沒有發生過替換操作,則表示當前已是有序狀態

* 2. 每進行一輪比較遍歷後,在進行第i輪之後,陣列尾部的n-i到n的數是有序的,無需再判斷

*

*

* @param content

*/public

static

int[

]sort

(int

content)

}// 優化點1:進行一輪的比較遍歷後,沒有發生過替換操作,則表示當前已是有序狀態

if(ordinalflag)

}return content;

}}我們將待排序的元素分為兩個區間,已排序區間和未排序區間。插入演算法的核心思想是取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入,並保證已排序區間的元素一直有序。

例如:要對一組資料 4,5,6,3,2,1,從小到大進行排序。插入排序的詳細過程如下:

假設要對n個元素進行插入排序,執行的步驟如下:

第一次取第乙個元素作為已排序區間,後續的n-1個元素作為未排序區間。

取未排序區間的第乙個元素,在已排序區間找到合適的位置,並保證已排序區間還是有序的。

以此類推,執行n-1次的步驟2,即可完成插入排序。

package cn.hgy.data.algorithm;

/** * 插入排序

** 演算法介紹:每次從未排序中選擇第乙個數新增到已排序的合適位置

* 時間複雜度:最優o(n),最壞o(n^2)

*

*

* @author guoyu.huang

* @version 1.0.0

*/public

class

insertionsort

;int

sortarrays =

sort

(arrays)

;for

(int i =

0; i < sortarrays.length; i++)}

/** * 排序

*

*     優化點:

* 1. 如果待排序的元素大於有序區的最大元素則直接在尾部插入

* 2. 等已排序區間的元素都移動好位置,再將元素插入指定位置,減少賦值操作

*

*

* @param content

*/public

static

int[

]sort

(int

content)

else

}// 優化點2:將元素插入指定位置,減少賦值操作

content[j +1]

= temp;

}return content;

}}將待排序的元素分為兩個區間,已排序區間和未排序區間。選擇排序每次會從未排序區間中找到最小的元素,將其放到已排序區間的末尾。

例如:要對一組資料 4,5,6,3,2,1,從小到大進行排序。選擇排序的詳細過程如下:

假設要對n個元素進行選擇排序,執行的步驟如下:

所有元素都在未排序區間

找出最小的數和未排序區間的第乙個元素進行位置替換。

以此類推,執行n-1次的步驟2,即可完成選擇排序。

package cn.hgy.data.algorithm;

/** * 選擇排序

** 演算法介紹:每次會從未排序區間中找到最小的元素,將其放到已排序區間的末尾

* 時間複雜度:最優o(n),最壞o(n^2)

*

*

* @author guoyu.huang

* @version 1.0.0

*/public

class

selectionsort

;int

sortarrays =

sort

(arrays)

;for

(int i =

0; i < sortarrays.length; i++)}

/** * 排序

** @param content

*/public

static

int[

]sort

(int

content)

} content[index]

= content[i]

; content[i]

= min;

}return content;

}}插入排序

選擇排序

o(1)為原地排序演算法。

穩定排序是指在原有的順序上,如果滿足條件,還能夠保留原有的順序。

例如:訂單按金額和時間來排序,如果是穩定的排序演算法,先按時間排序之後,再按金額排序。即可實現,如下圖:

在比較替換的**中,只處理大於的資料,相等的資料保持位置不變,所以是穩定的。

在比較替換的**中,只處理大於的資料,相等的資料保持位置不變,所以是穩定的。

選擇排序應該會互換元素之間的位置,所以會導致原有的順序發生變化,所以不算穩定排序。

例如:5,8,5,2,9 這樣一組資料,使用選擇排序演算法來排序的話,第一次找到最小元素 2,與第乙個 5 交換位置,那第乙個 5 和中間的 5 順序就變了,所以就不穩定了。

時間複雜度,空間複雜度一樣,也都是穩定排序。氣泡排序和插入排序哪種更好呢?檢視**可知,一次交換中,插入排序的賦值操作為1次,氣泡排序的賦值操作為3次。插入排序更好一些。

Java排序演算法之氣泡排序 插入排序 選擇排序

一 前言 排序是日常中最常見的一種演算法,常見的演算法有 氣泡排序 插入排序 選擇排序 歸併排序 快速排序 計數排序 快速排序 基數排序 桶排序。那麼該怎樣分析和學習排序演算法呢?二 演算法的分析課 在上述的八種排序方法中,根據時間複雜度和是否基於比較可以為三種 排序演算法 時間複雜度 是否基於比較...

排序演算法 冒泡 選擇 插入排序

本文簡單總結一下三大排序演算法,如有不足,請多多提意見。簡述 從小到大排序,每次比較兩個元素,看他們的順序有沒有錯,如果錯了就換過來。a 比較abc.元素,如果第乙個比第二個大,則將兩個元素交換位置 bac.再依次將a和c進行比較。b 對每一對相鄰的元素做同樣的工作,從第一對到最後一對。這一次執行完...

排序演算法 冒泡 選擇 插入排序

外層迴圈控制大排序次數,內層迴圈控制每次大排序的排序次數 一次大排序就可以把最小的資料放在最前面。1 對陣列中的各資料,依次比較相鄰的兩個元素的大小 2 如果前面的資料大於後面的資料,就交換著兩個資料。經過第一 排序後,便可把最小的資料排好。3 然後再用同樣的方法吧剩下的資料逐個比較,最後得到從小到...