詳解氣泡排序和對其優化的Shaker 排序

2022-09-22 21:12:26 字數 2710 閱讀 7616

顧名思義,就是排序時,最大的元素會如同氣泡一樣移至右端,其利用比較相鄰元素的方法,將大的元素交換至右端,所以大的元素會不斷的往右移動,直到適當的位置為止。

基本的氣泡排序法可以利用旗標的方式稍微減少一些比較的時間,當尋訪完陣列後都沒有發生任何的交換動作,表示排序已經完成,而無需再進行之後的迴圈比較與交換動作,例如:

排序前:95 27 90 49 80 58 6 9 18 50

27 90 49 80 58 6 9 18 50 [95] 95浮出 

27 49 80 58 6 9 18 50 [90 95] 90浮出 

27 49 58 6 9 18 50 [80 90 95] 80浮出 

27 49 6 9 18 50 [58 80 90 95] ...... 

27 6 9 18 49 [50 58 80 90 95] ...... 

6 9 18 27 [49 50 58 80 90 95] ...... 

6 9 18 [27 49 50 58 80 90 95] 由於接下來不會再發生交換動作,排序提早結束 

在上面的例子當中,還加入了乙個觀念,就是當進行至i與i+1時沒有交換的動作,表示接下來的i+2至n已經排序完畢,這也增進了氣泡排序的效率。   

[cpp] 

void bubble(int number)  

}        

}   

printf("sorted   array is : ");  

for(i = 0; i < max; i++)  

printf("%d ", number[i]);        

printf("\n");  

}   

上述的氣泡排序已經不是純粹意義上的氣泡排序了,加入了旗標和減少了比較的範圍。其演算法複雜度很容易得知是o(n*n),從冒泡的特徵可以看出每次都是將最大值冒到右邊,那麼我們也可以把最小值冒到左邊,同理,也可以兩者同時進行,那麼兩者同時進行的排序就是shake 排序,  

乙個排序的例子如下所示:

排序前:45 19 77 81 13 28 18 19 77 11

往右排序:19 45 77 13 28 18 19 77 11 [81]

向左排序:[11] 19 45 77 13 28 18 19 77 [81]

往右排序:[11] 19 45 13 28 18 19 [77 77 81]

向左排序:[11 13] 19 45 18 28 19 [77 77 81]

往右排序:[11 13] 19 18 28 19 [45 77 77 81]

向左排序:[11 13 18] 19 19 28 [45 77 77 81]

往右排序:[11 13 18] 19 19 [28 45 77 77 81]

向左排序:[11 13 18 19 19] [28 45 77 77 81]  

我們可以用兩個旗標來記錄左邊已經排好序的位置和右邊已經好的位置, 需要注意的地方是每次將佇列向左邊冒一次,那麼就是將最小值冒到了左邊,反之就是將最大值冒到了右邊。  

[cpp]  

void ultimatebubblesort(int number)  

}    

left = offset;  

// 向右邊冒泡 是將最大值冒到左邊   

for(i = left; i < right; i++)  

}  right = offset;  

}  printf("sorted   array is : ");  

for(i = 0; i < max; i++)  

printf("%d ", number[i]);        

printf("\n");  

}   

整體的**如下:  

[cpp]  

#include  

#include  

#include  

#define max 10  

#define swap(x,y)  

void bubble(int number)  

}        

}   

printf("sorted   array is : ");  

for(i = 0; i < max; i++)  

printf("%d ", number[i]);        

printf("\n");  

}    

void ultimatebubblesort(int number)  

}    

left = offset;  

// 向右邊冒泡 是將最大值冒到左邊   

for(i = left; i < right; i++)  

}  right = offset;  

}  printf("sorted   array is : ");  

for(i = 0; i < max; i++)  

printf("%d ", number[i]);        

printf("\n");  

}    

int main()  

printf("\n");  

//   bubble(number);  

ultimatebubblesort(number);  

system("pause");  

return 0;      

}   

氣泡排序及其優化詳解

最近看了比較多的排序及其優化方案,感覺有許多寫的不錯。於是自己也寫了一點筆記,如果還有其他優化方案也希望大家能積極分享。我就話不多說直接貼 吧 public void bublesort int arr for int i 0 i arr.length i 氣泡排序優化一 public void b...

氣泡排序和優化

計算機中解決問題,一定要學會問題分解,先解決比這個容易解決的問題,再慢慢加深 比如 我要對陣列排序,那麼我能不能先求陣列的最小值,放在第乙個位置,這樣一來反覆執行這個操作,就能排序了 比如 我要求子陣列的排序,那麼我先解決整個陣列的排序,然後在改進 變成子陣列的排序 package day7yue1...

氣泡排序和優化

pragma once includeusing namespace std void swap int x,int y 交換函式 void print int a,int len,int i 輸出函式 cout endl void bubblesort int a,int len 氣泡排序 pri...