一、算法描述:
1.比較相鄰的元素肴茄,如果前一個(gè)比后一個(gè)大,交換
2.第一次排序第1個(gè)和第2個(gè)一對(duì)但指,比較與交換寡痰,然后第二個(gè)和第三個(gè)對(duì)比交換,以此類推棋凳,直到比較倒數(shù)第二個(gè)和最后一個(gè)為止
3.重復(fù)步驟2拦坠,直到?jīng)]有任何數(shù)字需要進(jìn)行比較
二、算法分析
時(shí)間復(fù)雜度
1.正序(一趟掃描即可完成排序)
所需的關(guān)鍵字比較次數(shù) C 和記錄移動(dòng)次數(shù) N 都是最小值:(n:數(shù)據(jù)規(guī)模)
Cmin=n-1
Mmin=0
2.逆序(進(jìn)行n-1次排序)
每次排序都要進(jìn)行 n-i 次比較(1<=i<=n-1)剩岳,且每次比較都需要移動(dòng)贞滨,這種情況,比較和移動(dòng)次數(shù)都達(dá)到了最大
Cman= n(n-1)/2=O(n2)
Mman=3n(n-1)/2=O(n2)
冒泡排序的平均時(shí)間復(fù)雜度為O(n2)
算法穩(wěn)定性
冒泡排序就是把小的元素往前調(diào)或者把大的元素往后調(diào)拍棕。比較是相鄰的兩個(gè)元素比較疲迂,交換也發(fā)生在這兩個(gè)元素之間。所以莫湘,如果兩個(gè)元素相等,是不會(huì)再交換的郑气;如果兩個(gè)相等的元素沒有相鄰幅垮,那么即使通過前面的兩兩交換把兩個(gè)相鄰起來,這時(shí)候也不會(huì)交換尾组,所以相同元素的前后順序并沒有改變忙芒,所以冒泡排序是一種穩(wěn)定排序算法
三示弓、具體代碼
1.Java
public class BubbleSort implements IArraySort {
@Override
public int[] sort(int[] sourceArray) throws Exception {
// 對(duì) arr 進(jìn)行拷貝,不改變參數(shù)內(nèi)容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
for (int i = 1; i < arr.length; i++) {
// 設(shè)定一個(gè)標(biāo)記呵萨,若為true奏属,則表示此次循環(huán)沒有進(jìn)行交換,也就是待排序列已經(jīng)有序潮峦,排序已經(jīng)完成囱皿。每次遍歷標(biāo)志位都要先置為true,才能判斷后面的元素是否發(fā)生了交換
boolean flag = true;
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = false;
}
}
//// 判斷標(biāo)志位是否為false忱嘹,如果為false嘱腥,說明后面的元素已經(jīng)有序,就直接return
if (flag) {
break;
}
}
return arr;
}
}
2.C語言
/* 冒泡排序 */
/* 1. 從當(dāng)前元素起拘悦,向后依次比較每一對(duì)相鄰元素齿兔,若逆序則交換 */
/* 2. 對(duì)所有元素均重復(fù)以上步驟,直至最后一個(gè)元素 */
/* elemType arr[]: 排序目標(biāo)數(shù)組; int len: 元素個(gè)數(shù) */
void bubbleSort (elemType arr[], int len) {
elemType temp;
int i, j;
for (i=0; i<len-1; i++) /* 外循環(huán)為排序趟數(shù)础米,len個(gè)數(shù)進(jìn)行l(wèi)en-1趟 */
for (j=0; j<len-1-i; j++) { /* 內(nèi)循環(huán)為每趟比較的次數(shù)分苇,第i趟比較len-i次 */
if (arr[j] > arr[j+1]) { /* 相鄰元素比較,若逆序則交換(升序?yàn)樽蟠笥谟移ㄉ#敌蚍粗?*/
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
int main (void) {
elemType arr[ARR_LEN] = {3,5,1,-7,4,9,-6,8,10,4};
int len = 10;
int i;
bubbleSort (arr, len);
for (i=0; i<len; i++)
printf ("%d\t", arr[i]);
putchar ('\n');
return 0;
}
3.C++
#include <iostream>
using namespace std;
template<typename T>
//整數(shù)或浮點(diǎn)數(shù)皆可使用
void bubble_sort(T arr[], int len){
int i, j; T temp;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)
if (arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
int main(){
int arr[] = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 };
int len = (int) sizeof(arr) / sizeof(*arr);
bubble_sort(arr, len);
for (int i = 0; i < len; i++)
cout << arr[i] << ' ';
cout << endl;
float arrf[] = { 17.5, 19.1, 0.6, 1.9, 10.5, 12.4, 3.8, 19.7, 1.5, 25.4, 28.6, 4.4, 23.8, 5.4 };
len = (int) sizeof(arrf) / sizeof(*arrf);
bubble_sort(arrf, len);
for (int i = 0; i < len; i++)
cout << arrf[i] << ' ';
return 0;
}
4.Kotlin
fun bubbleSort(array: Array<Int>) {
val arrayLength = array.size
for (i in 0 until arrayLength) {
for (j in 0 until arrayLength - i - 1) {
if (array[j] > array[j + 1]) {
val temp = array[j]
array[j] = array[j + 1]
array[j + 1] = temp
}
}
}
// Prints result.
}