回覆列表
  • 1 # java架構設計

    我們先來看看氣泡排序的演算法是如何定義的:

    冒泡演算法氣泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序演算法。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“氣泡排序”。Java編碼實現

    瞭解了氣泡排序的基本定義之後,根據其思想我們來根據題主的要求看看如何用Java實現氣泡排序演算法,程式碼如下圖:

    基本原理就是如下的邏輯走向:

    執行後輸出如下:

    有沒有發現什麼問題?是不是到了第6次已經完成排序了?後面的是不是就屬於浪費了?所以我們需要最佳化一下,當他的順序已經排序完畢了就不再進行排序了,最佳化後的程式碼如下:

    執行後輸出:

    可以看出來只執行了6次排序。

    演算法複雜度

    那麼冒泡演算法的複雜度是怎樣的呢?相信大家看到這已經基本上可以算出來了:

    時間複雜度:兩層迴圈O(n²);

    空間複雜度:還是原來的陣列,沒有開闢新的記憶體空間,所以是O(n)。

  • 2 # 淺析架構

    氣泡排序是最基本的排序演算法,時間複雜度為O(n**2)。

    你想成大的氣泡往上冒就行。

    具體思路是(從小到大排列):

    1、陣列中從第一個元素開始,每次和下一個元素比較,如果大就往上冒泡,也就是交換順序,直到最後一個,這樣就把最大的元素放在了陣列最後一個;

    2、然後再從第一個元素開始冒泡,但是隻比較到倒數第二個,因為最後一個已經是最大的了,不用再比較。

    程式碼:

  • 3 # 程式設計藝術思維

    不廢話上程式碼:

    public static int[] bobleSort(int[] arr) {

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

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

    if (arr[j] > arr[j+1]) {

    int temp = arr[j];

    arr[j] = arr[j+1];

    arr[j+1] = temp;

    }

    }

    printArray(arr);

    System.out.println("第幾次排序"+ i);

    }

    return arr;

    }

    public static void printArray(int[] arr) {

    for(Integer item : arr) {

    System.out.print(item+" ");

    }

    }

    public static void main(String[] agrs) {

    int[] arr = new int[] {23,43,45,21,32,67,21,90};

    printArray(arr);

    System.out.println("最初順序");

    int[] boor=bobleSort(arr);

    printArray(boor);

    System.out.println("最後結果");

    }

    執行結果:

    23 43 45 21 32 67 21 90 最初順序

    23 43 21 32 45 21 67 90 第幾次排序0

    23 21 32 43 21 45 67 90 第幾次排序1

    21 23 32 21 43 45 67 90 第幾次排序2

    21 23 21 32 43 45 67 90 第幾次排序3

    21 21 23 32 43 45 67 90 第幾次排序4

    21 21 23 32 43 45 67 90 第幾次排序5

    21 21 23 32 43 45 67 90 第幾次排序6

    21 21 23 32 43 45 67 90 第幾次排序7

    21 21 23 32 43 45 67 90 最後結果

    ————————————————

  • 4 # 你看我獨角獸嗎

    (氣泡排序過程及結果展示)

    一般而言,氣泡排序有以下步驟:

    設陣列長度為N,比較前後相鄰的兩個資料,如果前值大於後值,就將這兩個值交換。

    重複以上步驟,從第0個數據到N-1個數據進行遍歷,最大值就會沉在下方。

    以上就是氣泡排序的基本思想,按照這個定義很快就能寫出程式碼:

    測試程式碼:

    執行結果如下:

    0,1,1,2,3,3,4,7,8,9,12,22,65

    當然,如果序列本身有一部分是有序序列,或者本來就排序已經完成,那麼遍歷會帶來不少開銷,可以設定一個布林值進行開關操作。如果已經完成排序,那麼中止遍歷,如果未完成,繼續遍歷。

  • 5 # EmacserVimer

    氣泡排序應該算是計算機專業演算法裡面最簡單的演算法了,與選擇排序,插入排序算是演算法裡面最為基礎的排序方法了,當然雖然簡單,可能對於很多真正從事一線開發的用得比較多的,但是這裡以氣泡排序來說明,但本文並不想說具體的程式碼實現方法。

    首先氣泡排序,顧名思義,由字面意義理解,很顯然是很形象的,想象一下水中氣泡冒起來的樣子你就大概明白的。這裡以兩個為單位,然後比較兩個數字的大小,小的就排在前面,就是“上浮”的意思。第二輪就用下一個數字去匹配前兩個數字,然後在根據大小調整順序,迴圈往復,最終得到結果,其實很簡單。說到這裡其實並不想給大家說到底這個演算法是怎麼實現的,因為這類演算法的實現簡直太多了,但是演算法最重要的還是思考問題的方式,就像計算機程式語言,為什麼要有迴圈、條件語句一樣。計算機程式是聰明的,但計算機本身是機械的,計算機只能理解最簡單的“是”或者“不是”,也就是我們通常所說的二進位制程式碼“0”、“1”程式碼,對於學習計算機來說,最重要的還是計算機思維,如何像計算機一樣思考、處理問題。對於學習演算法,我認為最重要的還是幾點因素:

    嚴謹的數理邏輯思維

    對於學習計算機來說,毫無疑問,我永遠支援的觀點是,要想成為一個出色的程式設計師,一個優秀的軟體工程師,良好、嚴謹的數理邏輯思維是最重要的,你會發現,到最後決定一個程式設計師上限往往就是數理邏輯思維,也就是常說的天賦。你會發現很多在行業內頗有建樹的大牛,都是學生時代數學、物理這些課程學習得很好的,不是說數學不好就不聰明,只是做這一行,數學好會讓你在工作和學習中事半功倍,所以你也必須隨時訓練和提升自己的邏輯思維能力。

    掌握常用的演算法、也要多多瞭解演算法進展

    對於大多數一線的工程師來說,掌握最常用的一些演算法就可以,我覺得《演算法》(第四版)和《演算法導論》這兩本書綽綽有餘,基本上這兩本書能認真過一遍絕對足以應付日常所有工作。畢竟對於複雜的演算法,或者一些大公司來說,都有專門的演算法工程師幫你搞定,但是適當的瞭解一些演算法進展也是好的,比如老爺子的《計算機程式設計藝術》難度相當大,雖然很經典,但一些演算法也過時了,對於學習是好的,但未必就能緊跟時代。

    多實踐、多逛開源論壇

    最重要的還是實踐,這是一個從事一線開發的工程師最重要的,為什麼說萬小時理論非常有道理的,同行在程式設計開發領域也一樣,其實足夠多的實踐和訓練會讓你更加遊刃有餘。除此之外,多逛開源論壇絕對是大有裨益,現在越來越多的優秀程式設計師把自己的技術分享出來大家一起討論,開源的世界更是誕生了emacs,gcc,Linux,TensorFlow,tex,Java等等無數經典作品,所以絕對值得你投入時間和經歷去學習、去探索、甚至去貢獻。當然本文略微有點跑題,但是這是筆者看到這個問題以後的第一想法,畢竟氣泡排序的Java實現在無數的論壇出現了無數次,也是最基礎的演算法,所以建議更多的透過自己的探索去學會慢慢實現,最後希望每一個程式設計愛好者都能夠取得很好的成績。

  • 6 # 衡道吳琦

    演算法和語言無關,我用過八種程式語言,有時候跨語言移植邏輯,理解業務規則比程式設計示例更重要。氣泡排序的本質是數值大小的階段性交替,用雙迴圈數值位置交換即可簡單實現。這個演算法因為太簡單,甚至還沒有一個遞迴業務來得抽象,所以沒必要長篇大論,隨便百度一段程式碼就能明白。

  • 中秋節和大豐收的關聯?
  • DNF星空裂縫和超星空裂縫有什麼區別?平民玩家刷哪種深淵最划算?