1. 程式人生 > >詳解氣泡排序及Python3程式碼實現

詳解氣泡排序及Python3程式碼實現

下面詳細介紹氣泡排序的思想以及python3程式碼實現。

首先是這樣一個常識:在水中兩個相同深度的氣泡,大的氣泡上浮的快,最先上浮到水面。

然後假設有一個列表儲存著一組資料,如下所示:左端為裡表中的元素,右端為索引。


為什麼要豎著放,這樣可以給你‘冒泡’的感覺。當然我們很容易看出來8是最大的會最先浮出水面,但是計算機不會想我們這樣‘看’。它只會一步步來,首先假設第一個數(索引為0的數為最大的會先浮出水面),然後與相鄰的數(索引比它大的)比較。這裡發現8>2,所以更正假設:這時候認為8是會最先浮出水面的,然後與相鄰的交大索引的數比較,發現4<8,也就是說上面的4應該會晚於8浮出水面,這時候就需要交換位置,從上到下是7,3,8,4,2。這時候計算機仍然認為8是上浮最快的,然後依次與4和2比較,並且交換位置,交換完後從上到下的順序為8,7,3,4,2. 這時候計算機找到了最大的那個氣泡8.並認為最先浮出水面(然後只需要比較剩下的氣泡誰先浮出水面即可)。然後計算機再從索引0開始,直到n-2(最大的已經浮出水面)。n個元素的列表一共需要從索引0開始迴圈n-1次(每次選出剩餘氣泡中最大的,最後一個不需要再比較),每次迴圈需要比較的次數是n-1-i(i為大迴圈次數)。這裡有一點可以優化的地方:就是一次迴圈下來發現一次交換也沒有,說明剩下的氣泡已經按順序排列了,就不需要再迴圈了。詳細程式碼如下:

__author__ = "Allen Liu"
__time__ = "2017/8/13"
'''This program used to '''
import random
# 定義氣泡排序函式
def bubble_sort(data):
    for i in range(len(data) - 1):# 外迴圈每一次使得有序的數增加一個
        indicator = False # 用於優化(沒有交換時表示已經有序,結束迴圈)
        for j in range(len(data) - 1 - i):#內迴圈每次講無序部分中的最大值放到最上面
            if data[j] > data[j + 1]:
                data[j], data[j+1] = data[j+1], data[j]
                indicator = True
        if not indicator:#如果沒有交換說明列表已經有序,結束迴圈
            break
# 驗證演算法正確性
data = list(range(10))#產生一個有序列表
random.shuffle(data) # 呼叫shuffle函式打亂順序
print(data)# 排序前
bubble_sort(data)# 呼叫氣泡排序演算法
print(data)#排序後


相關推薦

氣泡排序Python3程式碼實現

下面詳細介紹氣泡排序的思想以及python3程式碼實現。 首先是這樣一個常識:在水中兩個相同深度的氣泡,大的氣泡上浮的快,最先上浮到水面。 然後假設有一個列表儲存著一組資料,如下所示:左端為裡表中的元素,右端為索引。 為什麼要豎著放,這樣可以給你‘冒泡’的感覺。當然我們很

Menu(一):程式碼實現系統選單子選單

前言:這周看到選單部分,以前也對選單有過使用,但並沒有系統的對選單進行梳理。這次藉著這個機會,對選單進行梳理。但只是很淺顯的系統講解,即對選單的種類及各種用法作了一些講述,並沒有對如何使用自定義的選單佈局做講述,等下次有機會再次遇到的時候再補充吧,一下搞太多,有點吃不消,很累

排序演算法之快速排序氣泡排序用python程式碼實現

一、快速排序 1.在列表中選出一個基準數(通常為列表的第一個數) 2.將列表中小於基準數的資料移到基準列表的左邊,將大於基準數的資料移到基準數的右邊 3.對於基準數左,右兩邊的列表,不斷重複以上兩個過程,直到每個子集只有一個元素, 即為全部有序的. def qu

排序GOLANG程式碼實現

堆排序及GOLANG程式碼實現   版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/mofiu/article/details/83620743 一、什麼是堆排序 堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一

新手必看——JAVA排序(氣泡排序和插入排序)

對於排序,它一直不厭其煩的出現在企業面試初級工程師的筆試題中,不管是氣泡排序還是插入排序,我們經常會在在初級面試題中遇見,就好像它已成為一種面試的標準。而對於程式設計師來說,基本排序就真的這麼重要嗎?當然不,作為一個老司機的我們已經知道,對於新手很心累的各種

氣泡排序--適用於初學者,包會

1.氣泡排序的基本思想就是:每次都比較兩個相鄰的元素,如果他們的順序錯誤就把他們的位置調換過來; 2.例如 5 9 7 6 1 8 13 4 他們每次都是兩兩比較,所以每一輪要比較n-i次(升續

八大排序演算法——氣泡排序

基本思想 將被排序的記錄陣列R[0..n-1]垂直排列,每個記錄R[i]看作是重量為R[i].key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描陣列R:凡掃描到違反本原則的輕氣泡,就使其 向上”飄浮”。如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。 具體過程,如下所示:

Java氣泡排序快速排序

氣泡排序   氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

氣泡排序優化

演算法思想   氣泡排序屬於一種典型的交換排序。   交換排序顧名思義就是通過元素的兩兩比較,判斷是否符合要求,如過不符合就交換位置來達到排序的目的。氣泡排序名字的由來就是因為在交換過程中,類似水冒泡,小(大)的元素經過不斷的交換由水底慢慢的浮到水的頂端。   氣泡排序的思想就是利用的比較交換,利用迴圈

邏輯迴歸(Logistic Regression),公式推導程式碼實現

邏輯迴歸(Logistic Regression) 什麼是邏輯迴歸:   邏輯迴歸(Logistic Regression)是一種基於概率的模式識別演算法,雖然名字中帶"迴歸",但實際上是一種分類方法,在實際應用中,邏輯迴歸可以說是應用最廣泛的機器學習演算法之一 迴歸問題怎麼解決分類問題?   將樣本的特徵和

EJB2.0教程 EJB技術實現原理

tee nsa 普通 事情 println 配置 ransac 教程 聲明 EJB是什麽呢?EJB是一個J2EE體系中的組件.再簡單的說它是一個能夠遠程調用的javaBean.它同普通的javaBean有兩點不同.第一點,就是遠程調用.第二點,就是事務的功能,我們在EJB中

AMD規範具體實現requireJS在工程中的使用

當前頁 eid 資源 自己 一個數 中比 ocs 網站 重定位   由CommonJS組織提出了許多新的JavaScript架構方案和標準,希望能為前端開發提供統一的指引。AMD規範就是其中比較著名一個,全稱是Asynchronous Module Definition

常用排序演算法java程式碼實現---快速排序氣泡排序,選擇排序

快速排序 public class QuickSort { public void qSort(int[] arr,int left,int right) { if(left>right) { return ; } int i = le

Java常用的八種排序演算法與程式碼實現(一):氣泡排序法、插入排序法、選擇排序

這三種排序演算法適合小規模資料排序 ---   共同點:基於比較,時間複雜度均為O(n2),空間複雜度均為O(1)(原地排序演算法)   不同點:插入排序和氣泡排序是穩定的排序演算法,選擇排序不是 ---   穩定排序演算法:可以保持數值相等的兩個物件,在排序之

Python四大流行排序演算法--快速排序-氣泡排序-選擇排序-插入排序

就作者而言使用Python經常用到的排序演算法就是快速排序、氣泡排序、選擇排序以及插入排序       就時間複雜度而言,快速排序是高階排序,查詢快速,時間複雜度為nlgn      而氣泡排序、選擇排序、插入排序則是比較低階的查詢演算法,時間複雜度為n**2 下面

JAVAWEB開發之Lucene——Lucene入門使用場景、全文檢索、索引CRUD、優化索引庫、分詞器、高亮、相關度排序、各種查詢

Lucene入門 應用場景 windows系統中的有搜尋功能:開啟“我的電腦”,按“F3”就可以使用查詢的功能,查詢指定的檔案或資料夾。搜尋的範圍是整個電腦中的檔案資源。 Eclipse中的幫助子系統:點選Help->Help Contents,可以查找出相關的幫助資

Java演算法實現氣泡排序優化

氣泡排序,是一種很簡單的排序演算法。原理就不過多介紹了,直接入手demo。 需求:輸入一組資料,用氣泡排序進行排序。 先用最直接的方法進行排序,程式碼如下: //對一組數進行氣泡排序 public class Bubble01 { public static void m

各種排序演算法總結C#程式碼實現

 排序是計算機內經常進行的一種操作,其目的是將一組“無序”的記錄序列調整為“有序”的記錄序列。分內部排序和外部排序。若整個排序過程不需要訪問外存便能完成,則稱此類排序問題為內部排序。反之,若參加排序的記錄數量很大,整個序列的排序過程不可能在記憶體中完成,則稱此類排序問

【專案實站】 php 實現抽獎程式碼【上篇】 基礎實現

基本思路:使用者生成一個隨機數,和出獎的獎品設定的隨機數比對一下。符合規則則中獎(使用者的隨機數< 獎品設定的概率值),不符則未中獎。 一 專案準備期,需求確認。和產品大哥一陣切磋後,認為需求1.0 //1 抽獎活動有起止時間 //2 獎品有限制個數的大獎,和不限次數的