氣泡排序以及優化

2022-08-19 08:39:09 字數 1848 閱讀 8795

最近需要用到氣泡排序,所以翻出來研究一下。氣泡排序的基礎其實就是元素交換,是一種極其簡單的排序演算法。

話不多說,直接上**:

1 #include 2

void bubble_sort(int arr, int

len)315

}16}17

}1819int

main () 20;

22int len = (int)sizeof(arr)/sizeof(arr[0

]);23

inti;

24bubble_sort(arr, len);

25for(i = 0; i < len; i++)

2629

return0;

30 }

以上是基礎版,下面來講一下原理。

首先初始化乙個陣列 arr =   我們需要從小到大對陣列元素進行排序,運用最簡單的元素交換步驟,比較相鄰兩個元素的大小,比較後,數值較大的往後移動。由此,兩兩比較多次後(這是一趟排序),數值最大的元素移動到陣列尾部。經過多趟排序之後,陣列元素將從小到大排列。

但是這樣的排序並不是最優選擇。因為按照以上的演算法,即使後面的資料已經排序完成,還是每一趟都要遍歷。以下是優化的演算法:

1 #include 2

void bubble_sort(int arr, int

len)318

}19如果沒有元素交換,表示序列是順序狀態,退出迴圈

2023}24

}25intmain () 26;

28int len = (int)sizeof(arr)/sizeof(*arr);

29int

i;30

bubble_sort(arr, len);

31for(i = 0; i < len; i++)

3235

return0;

36 }

當然,氣泡排序還有更優化的方法:雞尾酒排序,這種方法特點是在排序的過程中是雙向進行的。程式如下:

1 #include 2

3void cocktailsort(int arr, int

len);

4void swap(int *a, int *b);56

intmain () 7;

9int len = (int)sizeof(arr)/sizeof(*arr);

10int

i;11

cocktailsort(arr, len);

12for(i = 0; i < len - 1; i++)

1316

return0;

17}1819

void swap(int *a, int *b) //

交換兩元素的值

20

2627

void cocktailsort(int arr, int

len)

2841

}42 right--;

43for(i = right; i > left; i--) //

向左排序,確認最小元素

4450

}51 left++;52}

53 }

下圖是排序的模式,更直觀一點:

氣泡排序,最好的情況是序列已經是正序,時間複雜度為o(n),最壞的當然是逆序,時間複雜度為o(n^2),另外氣泡排序需要乙個空間作為資料交換的臨時儲存單元,因此空間複雜度為o(1)。

氣泡排序以及優化

排序 1.穩定的排序演算法 2.不穩定的排序演算法 3.比較排序 元素之間的次序依賴它們之間的比較,每個數需要與其他數進行比較才能確定自己的位置。比較典型的比較排序有快速排序,歸併排序,堆排序,氣泡排序。4非比較排序 非比較排序只要確定每個元素之前的已有元素個數即可,經過一次遍歷便可以解決。排序 1...

氣泡排序以及優化

氣泡排序是新手小白學的第乙個排序方法,複雜度很高。那麼如何在氣泡排序的基礎上對其進行優化?我們給一組資料 9,5,6,7,5,3 第一次冒泡 9和5交換位置 5,9,6,7,5,3 9和6交換位置 5,6,9,7,5,3 9和7交換位置 5,6,7,9,5,3 9和5交換位置 5,6,7,5,9,3...

氣泡排序以及氣泡排序的優化

很早接觸過氣泡排序法,但一直沒有真正的理解,只是為了記住而學習,今天又重新看了一下,其實氣泡排序法第一次排序會把最大的冒到最上面,第二次會把次大的泡冒到最大的後面,一次類推 另外在排序的次數上會逐漸減少。看 void bubble sort int a,int n 其實還可以優化一下,當發現沒有進行...