Go語言冒泡、選擇、插入、快速排序實戰淺析

Hello,各位小夥伴你們好,我是小棧君,今天爲你們帶來的分享是關於go語言中的排序實戰淺析。算法

咱們就實際操做關於go的冒泡排序、選擇排序、插入排序和快速排序四種方式的理論和實戰進行分享,但願可以爲你們在學習的路上帶來點啓發和經驗。編程

排序在咱們平時的編程工做中時常能夠見到,以按照不一樣的規則進行排序返回,以便於知足業務的須要。瞭解和學會編寫排序也算是咱們在學習編程語言中的算法前進的一小步了,因此呢,小夥伴一塊兒加油吧~數組

排序的含義

百度百科中有明確的闡述,排序是計算機內常常進行的一種操做,其目的是將一組「無序」的記錄序列調整爲「有序」的記錄序列。份內部排序和外部排序,若整個排序過程不須要訪問外存便能完成,則稱此類排序問題爲內部排序。編程語言

反之,若參加排序的記錄數量很大,整個序列的排序過程不可能在內存中完成,則稱此類排序問題爲外部排序。內部排序的過程是一個逐步擴大記錄的有序序列長度的過程。學習

冒泡排序

已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換二者的值,不然不變。再比較a[2]與a[3]的值,若a[2]大於a[3]則交換二者的值,不然不變。區塊鏈

再比較a[3]與a[4],以此類推,最後比較a[n-1]與a[n]的值。這樣處理一輪後,a[n]的值必定是這組數據中最大的。再對a[1]~a[n-1]以相同方法處理一輪,則a[n-1]的值必定是a[1]~a[n-1]中最大的。大數據

再對a[1]~a[n-2]以相同方法處理一輪,以此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。降序排列與升序排列相相似,若a[1]小於a[2]則交換二者的值,不然不變,後面以此類推。blog

總的來說,每一輪排序後最大(或最小)的數將移動到數據序列的最後,理論上總共要進行n(n-1)/2次交換。排序

它所具備的優勢就是穩定。可是缺點也是很是明顯,就是慢,每次只能移動相鄰兩個數據。圖片

因此咱們用一個例子形象的說明一下冒泡排序的原理,針對於上述多是對初學者理解起來有點抽象。

file

以上是一個數組中三個數字,咱們先看一下黑色線條,先是第一個數字2和第二個數字5作比較,若是說2比5大的話就交換兩個值的位置。
而後是2和1作比較,若是2比1大,相同的交換兩個數字的位置,因此咱們獲得了一、五、2這樣的數組,而後又開始進行5和2的對比,5比2大,而後交換位置,至此數據遍歷完畢。

獲得了一、二、5這樣的數組。固然咱們也能夠制定規則,數字大的冒泡,最終獲得的結果就是五、二、1這樣的數組。因此咱們實現的方式以下圖所示:

file

選擇排序

每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最後,直到所有待排序的數據元素排完。

也就是在一個數組中咱們要依次選擇最小的或是最大的數來進行數組裏面的值交換,最後獲得最終排序好的數組。

這樣作的優勢就是就是知道執行的次數是n-1次,可是缺點也很明顯就是比較次數較多。

用圖形表示如圖所示:

file

咱們先進行5和2對比,而後和1對比,找到最小的1,而後進行交換位置,此時無序的數組剩下5和2,而後找到最小的2,交換位置。最後將最大的5放入最後的位置。這樣就完成了最簡單的一個選擇排序。

具體代碼以下:

file

插入排序

已知一組升序排列數據a[1]、a[2]、……a[n],一組無序數據b[1]、b[2]、……b[m],需將兩者合併成一個升序數列。首先比較b[1]與a[1]的值,若b[1]大於a[1],則跳過。

比較b[1]與a[2]的值,若b[1]仍然大於a[2],則繼續跳過,直到b[1]小於a數組中某一數據a[x],則將a[x]~a[n]分別向後移動一位,將b[1]插入到原來a[x]的位置這就完成了b[1]的插入。

b[2]~b[m]用相同方法插入。(若無數組a,可將b[1]看成n=1的數組a)它所具備的優勢是穩定和快。

可是比較次數不必定,比較次數越多,插入點後的數據移動越多,特別是當數據總量龐大的時候,但用鏈表能夠解決這個問題。

若是目標是把n個元素的序列升序排列,那麼採用插入排序存在最好狀況和最壞狀況。最好狀況就是,序列已是升序排列了,在這種狀況下,須要進行的比較操做需(n-1)次便可。

最壞狀況就是,序列是降序排列,那麼此時須要進行的比較共有n(n-1)/2次。插入排序的賦值操做是比較操做的次數加上 (n-1)次。平均來講插入排序算法的時間複雜度爲O(n^2)。

於是,插入排序不適合對於數據量比較大的排序應用。可是,若是須要排序的數據量很小爲量級小於千,那麼插入排序仍是一個不錯的選擇。

file

因此咱們用圖像的形式描述的話,原始數組是一個須要進行排序的數組,咱們能夠將數組的第一個元素當成一個單獨且有序的數組A,而後剩下的元素造成新的數組C依次進行對比。

若是發現C中有元素比A中大就按照指定的規則插入元素的左側(或右側)。直至對比到C數組中的最後一個。此時A中的元素都是有序的數組。

代碼如圖所示:

file

file

快速排序

快速排序是你們已知的經常使用排序算法中最快的排序方法。已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。

首先任取數據a[x]做爲基準。比較a[x]與其它數據並排序,使a[x]排在數據的第k位,而且使a[1]~a[k-1]中的每個數據<a[x],a[k+1]~a[n]中的每個數據>a[x]。

而後採用分治的策略分別對a[1]~a[k-1]和a[k+1]~a[n]兩組數據進行快速排序。

它所具備的優勢屬於極快,數據移動少。固然存在的隱患就是不穩定。

file

因此結合圖片分享可能會更好容易理解一點。在一個無序的數組中,首先咱們肯定一個初始值,假定爲咱們取值爲第一個,而後對整個元素進行遍歷,將小於5位置排在左邊,將大於5的排在右邊,此時就分爲左右兩個陣營。

而後咱們將兩個陣營的元素各自再進行排序,最終就獲得了咱們排序好的數組啦。

具體代碼以下圖所示:

file

固然,這裏也是能夠不用傳左右邊界,咱們能夠默認爲初始值左邊界爲0,右邊界爲len(array)-1。

好了,今天的分享就到這啦,若是你喜歡個人分享,麻煩你點擊一個好看或贊,我是小棧君,不按期分享IT乾貨,包括但不限於區塊鏈、大數據、Python、go、等系列專題。原創不易,更新較慢,多多包涵。但願與你共同成長。咱們下期再見啦,拜了個拜~

相關文章
相關標籤/搜索