排序演算法之 氣泡排序 及其時間複雜度和空間複雜度
演算法分析
氣泡排序演算法是所有排序演算法中最簡單的(前面也提到過),在生活中應該也會看到氣泡從水裡面出來時,越到水面上氣泡就會變的越大。在物理上學氣壓的時候好像也看到過這種現象;其實理解氣泡排序就可以根據這種現象來理解:每一次遍歷,都把大的往後面排(當然也可以把小的往後面排),所以每一次都可以把無序中最大的(最小)的元素放到無序的最後面(或者說有序元素的最開始);
基本步驟:
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;