冒泡排序作為排序算法中很經(jīng)典也相對(duì)簡(jiǎn)單的算法沾谓,學(xué)編程的一定都會(huì)接觸委造,在最近的學(xué)習(xí)中對(duì)冒泡排序有更深入的理解,特此記錄均驶。
例題:要求將數(shù)組{3, 7, 2, -13, 19, 8}通過(guò)冒泡排序算法由小到大排序昏兆。
冒泡排序:比較相鄰的兩個(gè)元素,step1:(1)從第一個(gè)數(shù)開(kāi)始和第二個(gè)數(shù)比較妇穴,若第二個(gè)數(shù)比第一個(gè)大爬虱,則保持不變,若第一個(gè)數(shù)較大腾它,則這兩個(gè)數(shù)交換位置跑筝。
(2)同理,讓第二個(gè)數(shù)和第三個(gè)數(shù)比較
...
(n - 1)讓第n-1個(gè)數(shù)和第n個(gè)數(shù)比較
當(dāng)step1比較結(jié)束后瞒滴,此時(shí)數(shù)組的最后一個(gè)值一定為數(shù)組最大的一個(gè)值
step2:繼續(xù)以step1的規(guī)則進(jìn)行比較曲梗,需要注意的是此時(shí)最后一個(gè)數(shù)是不需要進(jìn)行排序的,因?yàn)橐呀?jīng)是最大的了。
...
step(n-1):都效仿step2
以第一次循環(huán)為例說(shuō)明比較過(guò)程虏两,3和7比7大所以保持不變愧旦,7和2比,7大所以2和7交換碘举,7再和-13比,7大繼續(xù)交換搁廓,7和19比19大保持不變引颈,19和8比,19大交換如下所示:
可以發(fā)現(xiàn)一個(gè)規(guī)律境蜕,循環(huán)的次數(shù) = 數(shù)組的長(zhǎng)度 - 1蝙场;比較的次數(shù) = 數(shù)組的長(zhǎng)度 - 1 - 第n次循環(huán)的n值。
最后附上python粱年、java的實(shí)現(xiàn)
python:
import os
class SortPort():
def __init__(self):
pass
def bubblesort(self, lis):
for j in range(len(lis) - 1): # 完整的一次排序需要的次數(shù)
for i in range(len(lis) - j - 1): # 每一次排序具體的交換次數(shù)
if lis[i] > lis[i + 1]:
lis[i], lis[i + 1] = lis[i + 1], lis[i]
print(l)
return l
if __name__ == '__main__':
l = [3, 7, 2, -13, 19, 8]
A = SortPort()
A.bubblesort(l)
Java:
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = new int[]{3, 7, 2, -13, 19, 8};
//冒泡排序
//n個(gè)元素的數(shù)組就需要進(jìn)行n-1大輪的排序
for (int i = 0;i < arr.length - 1;i++){
/*每一大輪的循環(huán)需要進(jìn)行的次數(shù)(第一大輪結(jié)束以后售滤,最后一個(gè)數(shù)一定為最大的值,
所以第二大輪排序時(shí)則不用管最后一個(gè)值台诗,第二大輪結(jié)束以后同理倒數(shù)第二個(gè)數(shù)是除了最后一個(gè)數(shù)以外的最大值)
*/
for (int j = 0;j < arr.length - i -1;j++){
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
未經(jīng)許可完箩,禁止轉(zhuǎn)載!