排序演算法c語言描述---雙向氣泡排序
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
排序算法系列學習,主要描述氣泡排序,選擇排序,直接插入排序,希爾排序,堆排序,歸併排序,快速排序等排序進行分析。
文章規劃:
一。通過自己對排序演算法本身的理解,對每個方法寫個小測試程式。 具體思路分析不展開描述。
二。通過《大話資料結構》一書的截圖,詳細分析該演算法 。
在此,推薦下程傑老師的《大話資料結構》一書,當然不是打廣告,只是以一名讀者的身份來客觀的看待這本書,確實是通俗易懂,值得一看。
ps:一個較為詳細的學習連結 http://blog.csdn.net/MoreWindows/article/category/859207
八。雙向氣泡排序。
一。個人理解
首先,這篇文章是建立在已經瞭解了氣泡排序的基礎上寫的。 如果對普通氣泡排序還有什麼不懂的,可以看看我之前的一篇部落格。
排序演算法c語言描述---氣泡排序 http://blog.csdn.net/hitwhylz/article/details/9773589
下面簡單談談雙向冒泡。
雙向氣泡排序是在氣泡排序的基礎上改進而來的,其基本思想跟最原始的氣泡排序是一樣的,只不過排序過程稍微優化了一點。
我們還是以整數升序排序為例來簡單說說這種排序的過程:首先從前往後把最大數移到最後,然後反過來從後往前把最小的一個數移動到陣列最前面,這一過程就是第一輪,然後重複這一過程,最終就會把整個陣列從小到大排列好。雙向氣泡排序要稍微優於傳統的氣泡排序,因為雙向排序時陣列的兩頭都排序好了,我們只需要處理陣列的中間部分即可,而單向即傳統的氣泡排序只有尾部的元素是排好序的,這時每輪處理都需要從頭一直處理到已經排好序元素的前面一個元素。雖然它在效率上有了點改進,但它也不能大幅度提高其排序的效率,這是由氣泡排序的基本過程所決定了的。
所以就本質來說,演算法上也沒什麼優化,只是雙向調整而已。下面具體看程式碼。
#include<stdio.h>#define Max_ 10// 列印結果void Show(int arr[], int n){ int i; for ( i=0; i<n; i++ ) printf("%d ", arr[i]); printf("\n");}// 交換陣列元素位置void Swap( int *num_a, int *num_b ){ int temp = *num_b; *num_b = *num_a; *num_a = temp;}//改進版的氣泡排序(雙向冒泡)void BidBubbleSort(int array[], int n){ int low, high, flag, i; low = 0; high = n - 1; while(low < high) { flag=0; for(i=low; i<high; i++) //正向冒泡 { if(array[i] > array[i+1]) //找到剩下中最大的 { Swap(&array[i], &array[i+1]); flag = 1; //標誌, 有資料交換 } } if( !flag ) break; high--; for( i=high; i>low; i-- ) //反向冒泡 { if(array[i] < array[i-1]) //找到剩下中最小的 Swap(&array[i], &array[i-1]); } low++; }}int main(){ //測試資料 int arr_test[Max_] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 }; //排序前陣列序列 Show( arr_test, Max_ ); BidBubbleSort( arr_test, Max_); //排序後陣列序列 Show( arr_test, Max_ ); return 0;}
總的來說,程式碼也沒什麼難度,思路也簡單,就不多做描述了。
按以往的行文風格,下面應該是《大話資料結構》一書的截圖了。
不過,雙向冒泡也不算一種全新的演算法,頂多是氣泡排序的優化,並且書中也沒有相關的知識,就不多做介紹了。
簡單的用測試程式中的排序過程來做個總結吧
雙向冒泡前陣列 8 4 2 3 5 1 6 9 0 7
第1次排序-->4 2 3 5 1 6 8 0 7 9 //第一次正向排序,得到未排序陣列中最大的數 9
第1次排序<--0 4 2 3 5 1 6 8 7 9 //第一次反向排序,得到未排序陣列中最小的數 0
第2次排序-->0 2 3 4 1 5 6 7 8 9 //第二次正向排序,得到未排序陣列中最大的數 8
第2次排序<--0 1 2 3 4 5 6 7 8 9 //第一次反向排序,得到未排序陣列中最大的數 1
第3次排序-->0 1 2 3 4 5 6 7 8 9 //運氣比較好,前兩次已經排好序了,flag = 0,不進行第三次排序
雙向冒泡後陣列 0 1 2 3 4 5 6 7 8 9