1. 程式人生 > >【大話資料結構&演算法】氣泡排序

【大話資料結構&演算法】氣泡排序

起泡排序又稱為氣泡排序。它是通過一系列的“交換”動作完成的。首先將第一和第二個記錄進行比較,如果第一個記錄大於第二個記錄,則兩者交換位置,否則保持原位置不變;然後比較第二和第三個記錄……一直按這種方式比較下去,最終最大的記錄被交換到最後,一趟氣泡排序完成。這個過程,大的記錄就像一塊石頭一樣“沉底”,小的記錄逐漸向上“浮動 ”,氣泡排序的名字也是由此而來的。

氣泡排序的步驟歸納如下(以升序排序為例):

1、依次比較序列中相鄰的兩個元素 ,將較大的放在後面,這樣一趟下來 ,最大的元素就被放到了最後;
2、接著重複第一步,第二趟下來, 第二大的元素就被放到倒數第二的位 置上;
3、依次迴圈,直到最小的元素被放 在第一個位置上,排序結束。

氣泡排序基本演算法實現如下:

//氣泡排序
void bubbleSort(int[] a, int n){
    int temp;
    for (int i = 0; i < n; i++) {
          for (int j = 1; j < n - i; j++) {
                if (a[j-1] > a[j]) {
                     temp = a[j-1];
                     a[j-1] = a[j];
                     a[j] = temp;
               }
         }
   }
}

java程式碼實現如下:

public class BubbleSort {

       public static void main(String[] args) {
             int[] a = {2,5,9,3,0,4,6};
             bubbleSort(a,7);
             bubbleSortAdvanced(a,7);
             for (int i = 0; i < a.length; i++) {
                  System. out.println(a[i]);
            }
            System. out.println("***********"
); bubbleSortAdvanced(a,7); for (int i = 0; i < a.length; i++) { System. out.println(a[i]); } } //原始氣泡排序(注意n的取值) public static void bubbleSort(int[] a, int n){ int temp; for (int i = 0; i < n; i++) { for (int j = 1; j < n - i; j++) { if (a[j-1] > a[j]) { temp = a[j-1]; a[j-1] = a[j]; a[j] = temp; } } } } /** * 氣泡排序優化: * * 設定一個標誌位flag,如果這一趟發生了交換,flag=true,否則flag=false。 * 如果有一趟沒有發生交換,說明排序已經完成。 * * 注意n的取值 */ public static void bubbleSortAdvanced(int[] a, int n){ int temp; boolean flag = true; while(flag){ flag = false; for (int i = 0; i < n; i++) { for (int j = 1; j < n; j++) { if (a[j-1] > a[j]) { temp = a[j-1]; a[j-1] = a[j]; a[j] = temp; flag = true;//如果本趟沒有發生資料交換,說明排序已經完成,不再進行比較 } } } } } }

時間複雜度

最壞情況下,待排序列逆序,此時對於外層迴圈的每次執行,內層迴圈中if語句的條件a[j-1] > a[j]始終成立,即基本操作執行的次數為n-i。i的取值為1 ~ n-1。因此,基本操作總的執行次數為(n-1+1)(n-1)/2=n(n-1)/2,由此可知時間複雜度為O(n2){n的平方}

最好情況下,待排序列有序,此時內層迴圈中if語句的條件始終不成立,交換不發生,且內層迴圈執行n-1次後整個演算法結束,時間複雜度為O(n)

綜上所述,氣泡排序的平均時間複雜度為O(n2){n的平方}

空間複雜度

由演算法程式碼可以看出,額外輔助空間只有一個temp,因此空間複雜度為0(1)

相關推薦

大話資料結構&演算法氣泡排序

起泡排序又稱為氣泡排序。它是通過一系列的“交換”動作完成的。首先將第一和第二個記錄進行比較,如果第一個記錄大於第二個記錄,則兩者交換位置,否則保持原位置不變;然後比較第二和第三個記錄……一直按這種方式比較下去,最終最大的記錄被交換到最後,一趟氣泡排序完成。這個過

大話資料結構&演算法直接插入排序

直接插入排序的基本思想:每趟將一個待排元素作為關鍵字,按照其關鍵字值得大小插入到已經排好序的部分序列的適當位置,直到插入完成。 演算法思想總結如下:(設待排序的陣列為a[0…n-1]) 1

資料結構演算法------氣泡排序

 學習開發一年的時間裡,很少去了解排序演算法,氣泡排序也是最開始學習的樣子,靠死記硬背,沒有引入自己的理解。  對於什麼時間複雜度和空間複雜度和穩定性也不清楚其原委,或許在程式碼方面少了幾許的天分: 氣泡排序: 氣泡排序每一輪的比較都是前面的數和後面的數進行比較,並交

大話資料結構02 演算法 筆記

《大話資料結構》 ——程傑 共463頁 筆記圈點主要內容,也請多多支援大話資料結構該書作者 第 2 章 演算法 42頁_開場白 44頁_演算法定義 演算法的定義

演算法資料結構專場排序是什麼鬼?

排序演算法相必大家都見過很多種,例如快速排序、歸併排序、氣泡排序等等。今天,我們就來簡單講講堆排序。 在上一篇中,我們講解了二叉堆,今天的堆排序演算法主要就是依賴於二叉堆來完成的,不清楚二叉堆是什麼鬼的,可以看下: 用輔助陣列來實現堆排序演算法 假如給你一個二叉堆,根據二叉堆的特性,你會怎麼使用二叉堆

大話資料結構第二章總結——演算法

1、演算法的定義 演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作。   2、演算法的特性 演算法具有五個基本特徵:輸入、輸出、有窮性、確定性、可行性 輸入輸出:演算法具有零個或多個輸入,至少一個或多

一起學習排序演算法氣泡排序

氣泡排序 Bubble sort 本系列的文章列表和相關說明,請檢視【一起學習排序演算法】0.序言 也可以直接到github上檢視完整的文章和原始碼! 原理 先看看Wikipedia的定義: Bubble sort is a simple sorting algorithm that

大話資料結構04 棧與佇列 筆記

《大話資料結構》 ——程傑 共463頁 筆記圈點主要內容,也請多多支援大話資料結構該書作者。 第 4 章 棧與佇列 111頁_定義 棧是限定在表尾進行插入和刪除操作的線性表。 佇列是隻允

大話資料結構01 資料結構的緒論 筆記

《大話資料結構》 ——程傑 共463頁 筆記圈點主要內容,也請多多支援大話資料結構該書作者。 第 1 章 資料結構的緒論 26頁_開場白 28頁_基本概念和術語 資料結構課程 是一門研究非

排序演算法氣泡排序(Bubble Sort)

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

排序演算法—— 氣泡排序、選擇排序

1、氣泡排序 這個氣泡排序的原理就像水裡的魚吐泡泡一樣,起初是小一點的泡泡,然後越來越大,最後的最大。 演算法描述: 1)設待排序序列中的記錄的數為n 2)一般的,第i趟起泡排序從1到n-i+1 3)依次比較相鄰兩個記錄的數字,如果發生逆序,則交換 4)其結果是這n-i+1個記錄中,

演算法氣泡排序(從小到大) 排序範圍(0~n-1)n為陣列元素個數

  今天要談的是基本排序演算法中的氣泡排序。除了氣泡排序,基本排序演算法還包括:選擇排序、插入排序。   插入排序演算法的思想也是很簡單的,它把排序過程模擬成了從水底冒氣泡的過程。一趟排序過程結束後,

大話資料結構第三章總結——線性表

1、線性表 零個或多個數據元素的有限序列。 若線性表中存在多個元素,則第一個元素無前驅,最後一個元素無後繼,其他每個元素都有且只有一個前驅和後繼。 線性表元素的個數n(n≥0)定義為線性表的長度,當n=0時,稱為空表。   2、線性表的抽象資料型別

大話資料結構第一章總結——資料結構緒論

程式設計 = 資料結構 + 演算法   前言 邊讀書邊做筆記,才能更好的學習。 以下是我根據《大話資料結構》做的總結,在加深自己印象的同時,希望可以幫助各位更好地瞭解資料結構。   1、基本概念和術語 資料: 是描述客觀事物的符號,是計算機

大話資料結構第五章總結——串

1、串的定義 串(string)是由零個或多個字元組成的有限序列,又名叫字串   串的長度 串中的字元數目n稱為串的長度   空串 零個字元的串即為空串(null string)   空格串

大話資料結構第四章總結——棧與佇列

目錄 1、棧的定義 2、棧的抽象資料型別 3、棧的順序儲存結構及實現 1、棧的順序儲存結構 2、棧的順序儲存結構——進棧操作 3、棧的順序儲存結構——出棧操作 4、兩棧共享空間 5、棧的鏈式儲存結構及實現 1、棧的鏈式儲存結構(簡稱鏈棧) 2、棧的鏈式儲存結構

資料結構演算法約瑟夫環問題(線性表)

據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下一個重新報數,直到所有人都自殺

大話資料結構——-資料結構

資料結構,顧名思義:就是計算機儲存、組織資料的方式。 定義: 資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。 使用資料結構的好處: 通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關。 資料結構是指相互之

資料結構演算法如何使用棧計算字尾表示式

無聊寫的一個使用棧計算字尾表示式的程式碼: 初次寫,只有+-*/四個運算子,後面可以自己加,都差不多就是個算術運算子優先順序的問題。 主函式:包括初始化*+-/符號,判斷輸入的字元是運算元還是運算子。 /** * !!!!!(棧相關測試) * @author WZ

演算法氣泡排序與選擇排序的遞迴實現

1 氣泡排序 1 氣泡排序: void bubbleSort(int *data,int start,int end) { if (start < end) { int temp = 0; int length = end -