1. 程式人生 > >排序演算法之 氣泡排序 及其時間複雜度和空間複雜度

排序演算法之 氣泡排序 及其時間複雜度和空間複雜度

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

演算法分析

        氣泡排序演算法是所有排序演算法中最簡單的(前面也提到過),在生活中應該也會看到氣泡從水裡面出來時,越到水面上氣泡就會變的越大。在物理上學氣壓的時候好像也看到過這種現象;其實理解氣泡排序就可以根據這種現象來理解:每一次遍歷,都把大的往後面排(當然也可以把小的往後面排),所以每一次都可以把無序中最大的(最小)的元素放到無序的最後面(或者說有序元素的最開始);

        基本步驟:

   1、外迴圈是遍歷每個元素,每次都放置好一個元素;   

2、內迴圈是比較相鄰的兩個元素,把大的元素交換到後面;

3、等到第一步中迴圈好了以後也就說明全部元素排序好了;

程式碼實現

 #include<stdio.h>
 //列印陣列元素
 void print_array(int *array, int length)
 {
     int index = 0;
     printf("array:\n");
     for(; index < length; index++){
         printf(" %d,", *(array+index));
     }   
     printf("\n\n");
 }
 
 void bubbleSort(int array[], int length)
 {
     int i, j, tmp;
     
     if (1 >= length) return;// 判斷引數條件
 
     for (i = length-1; i > 0; i--){//外迴圈,迴圈每個元素
         for (j = 0; j < i; j++){  // 內迴圈,
             if (array[j] > array[j+1]){// 交換相鄰的兩個元素
                 tmp        = array[j];
                 array[j]   = array[j+1];
                 array[j+1] = tmp;
             }   
         }   
     }   
 }

 int main(void)
 {
     int array[12] = {1,11,12,4,2,6,9,0,3,7,8,2};
     print_array(array, 12);
     bubbleSort(array, 12);
     print_array(array, 12);
     return 0;
 }

執行結果:


時間複雜度

      這個時間複雜度還是很好計算的:外迴圈和內迴圈以及判斷和交換元素的時間開銷;

最優的情況也就是開始就已經排序好序了,那麼就可以不用交換元素了,則時間花銷為:[ n(n-1) ] /  2;所以最優的情況時間複雜度為:O( n^2 );

最差的情況也就是開始的時候元素是逆序的,那麼每一次排序都要交換兩個元素,則時間花銷為:[ 3n(n-1) ] / 2;(其中比上面最優的情況所花的時間就是在於交換元素的三個步驟);所以最差的情況下時間複雜度為:O( n^2 );

        綜上所述:

最優的時間複雜度為:O( n^2 ) ;有的說 O(n),下面會分析這種情況;

最差的時間複雜度為:O( n^2 );

平均的時間複雜度為:O( n^2 );

空間複雜度

空間複雜度就是在交換元素時那個臨時變數所佔的記憶體空間; 最優的空間複雜度就是開始元素順序已經排好了,則空間複雜度為:0; 最差的空間複雜度就是開始元素逆序排序了,則空間複雜度為:O(n); 平均的空間複雜度為:O(1);

最優時間複雜度 n

        有很多人說氣泡排序的最優的時間複雜度為:O(n);其實這是在程式碼中使用一個標誌位來判斷是否已經排序好的,修改下上面的排序程式碼:
 void bubbleSort(int array[], int length)
 {
     int i, j, tmp;
     int flag = 1;
     
     if (1 >= length) return;
 
     for (i = length-1; i > 0; i--, flag = 1){ 
         for (j = 0; j < i; j++){
             if (array[j] > array[j+1]){
                 tmp        = array[j];
                 array[j]   = array[j+1];
                 array[j+1] = tmp;
                 flag = 0;
             }   
         }   
         if (flag) break;
     }   
 }
        根據上面的程式碼可以看出,如果元素已經排序好,那麼迴圈一次就直接退出。或者說元素開始就已經大概有序了,那麼這種方法就可以很好減少排序的次數;其實我感覺這種方法也有弊端,比如 要額外的判斷下,以及賦值操作;

空間複雜度為 0

        有人會說這個空間複雜度能降到0,因為空間複雜度主要是看使用的輔助記憶體,如果沒有輔助記憶體變數,那麼可以說空間複雜度為0;所以該演算法中空間複雜度一般是看交換元素時所使用的輔助空間;        1、 a  = a + b; b = a - b; a = a - b;        2、 a = a * b;   b =  a / b; a = a / b;        3、 a = a ^ b;  b =  a ^ b;a = a ^ b;         上面幾種方法都可以不使用臨時空間來交換兩個元素,但是都有些潛在的問題,比如 越界;所以個人覺得還是老老實實的用個臨時變數吧,這樣演算法意圖就比較清晰了。

相關推薦

排序演算法 氣泡排序 及其時間複雜空間複雜

        氣泡排序(Bubble Sort),是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因

排序演算法氣泡排序及其優化

定義:每一趟都是相鄰兩個元素進行比較,將小數放在前面,大數放在後面,最終一趟走完,最大的數也就跑到最後面了。 氣泡排序是常見的一種排序方法,比較簡單,容易理解,多用於教學(>﹏<) 最壞情況下時間複雜度:O(N^2) 。 比較次數是n(n-1)/2。 注

c#程式碼實現排序演算法氣泡排序

氣泡排序的平均時間複雜度為O(n²),最好時間複雜度為O(n),最壞時間複雜度為O(n²),空間複雜度為O(1),是一種穩定的演算法。 1.將整個待排序的記錄序列劃分成有序區和無序區,初始時有序區為空,無序區包括所有待排序的記錄。 2.對無序區從前向後依次比較相鄰記錄,若反序則交

排序演算法氣泡排序(關鍵詞:資料結構/演算法/排序演算法/氣泡排序

假定:有 1 個亂序的數列 nums ,其中有 n 個數。 要求:排好序之後是 從小到大 的順序。 氣泡排序演算法 程式碼 from swap import swap def bubble_sort(nums): n = len(nums) for i in rang

排序演算法氣泡排序【java實現】

氣泡排序介紹 基本思想就是相鄰資料交換,每次將最大或最小的數進行移動。 步驟:(1)對陣列中的各資料,依次比較相鄰的兩個元素的大小。            (2)如果前面的資料大於(小於)後面的資料,就交換這兩個資料。經過第一輪

排序演算法氣泡排序——2種形式

1.第一種形式氣泡排序 package Sort; public class BubbleSort1 {     public static void main(String[] args) {      &nbs

排序演算法氣泡排序改進演算法

前言 排序演算法中最最常見也算是入門的一個排序演算法就是氣泡排序。這篇文章我們就來好好地寫寫這個氣泡排序演算法,以及氣泡排序呢的改進演算法。 傳統冒泡演算法 static int[] array = {100,1,5,4,11,2,20,18,89,34,20,34}; @Test publ

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

<1>氣泡排序 這個名詞的還是很形象的,就是每次比較相鄰的兩個數,大的數總是往後面冒,所以每輪比較結束後,大數都會冒到最後面。 每次比較的結果如下: 無序陣列  :8 2 4 3 5 7 1 9 6 (後面所有的排序都將使用這個陣列) 第一輪比較:2 4 3 5

陣列排序演算法氣泡排序

一、基本思想 氣泡排序的基本思想就是對比相鄰的元素值,如果滿足條件就交換元素值,把較小的元素移動到陣列的前面,把大的元素移動到陣列後面(也就是交換兩個元素的位置),這樣較小的元素就像氣泡一樣從底部上升

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

1 氣泡排序 顧名思義:小的數一點一點向前冒,最終有序 public static void bubbleSort(int[] arr){ if(arr == null || arr.length <2){ return; } for(int i

排序演算法氣泡排序

氣泡排序 顧名思義,氣泡排序直觀的意思是氣泡越大冒的越快:),對應到我們的列表中就是數字最大的先選出來,然後依次進行。例如 myList = [1,4,5,0,6],比較方式為: 相鄰的兩個數字先進行比較,也就是myList[0]和myList[1],發現不是"

Java經典排序演算法氣泡排序(Bubble sort)

原理: 比較兩個相鄰的數,將大值交換到右邊,依次進行比較,直到排序完成圖解:以上圖片來源於百度Java實現:      /** * java實現氣泡排序 */ private static int[] arrays={2,16,8,32,64,10

排序演算法氣泡排序的思想以及Java實現

1 基本思想 設排序表長為n,從後向前或者從前向後兩兩比較相鄰元素的值,如果兩者的相對次序不對(A[i-1] > A[i]),則交換它們,其結果是將最小的元素交換到待排序序列的第一個位置,我們

php排序演算法氣泡排序

目錄 一: 原理 二: 舉例說明 三: PHP程式碼實現氣泡排序 一: 原理 對一組資料,比較相鄰資料的大小,將值小資料在前面,值大的資料放在後面。   (以下都是升序排列,即從小到大排列) 二: 舉例說明 $arr = array(6, 3, 8, 2

常見排序演算法氣泡排序

常見排序演算法之氣泡排序 氣泡排序(Bubble Sort),是一種較簡單的排序演算法。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從小到大、首字母從A到Z)錯誤就把他們交換過來。 氣泡排序演算法的運作如下: 比較相鄰的元素。

Java排序演算法氣泡排序選擇排序

import java.util.Arrays; class Demo { public static void main(String[] args) { int

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

氣泡排序的思想:將帶排序的序列兩兩進行比較,較大的一個“冒泡”,“冒泡”即如果下標為A 與B的資料比較,A 大則與B交換位置,否則就不交換位置,交換位置後,此時B的位置程式設計A,B 的下一個位置是B,兩者在進行比較,每進行一輪排序,總是較大的數排在剩下序列的最高位,也因此為

演算法排序演算法氣泡排序

排序算法系列目錄說明 氣泡排序(Bubble Sort) 插入排序(Insertion Sort) 希爾排序(Shell Sort) 選擇排序(Selection Sort) 快速排序(Quick Sort) 歸併排序(Merge Sort) 堆排序(Heap

排序演算法氣泡排序快速排序(Java版)

轉自:http://www.cnblogs.com/0201zcr/p/4763806.html  作者:Whywin 1、氣泡排序 演算法如下(排序後,由小到大排列): /** * 氣泡排序 * 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

js排序演算法氣泡排序

//功能:氣泡排序 //引數:arr, 待排序陣列 //返回:arr1,排序後陣列 function bubbleSort(arr) { var len = arr.length;