您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關web開發中冒泡排序是什么意思,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
冒泡排序一種簡單的排序算法。它會遍歷若干次要排序的數列,每次遍歷時,它都會從前往后依次的比較相鄰兩個數的大小;如果前者比后者大,則交換它們的位置。這樣,一次遍歷之后,最大的元素就在數列的末尾! 采用相同的方法再次遍歷時,第二大的元素就被排列在最大元素之前。重復此操作,直到整個數列都有序為止!
下面以數列{20,40,30,10,60,50}為例,演示它的冒泡排序過程(如下圖)。
我們首先分析第一趟排序:
當i=5,j=0時,a[0]<a[1]。此時,不做任何處理!
當i=5,j=1時,a[1]>a[2]。此時,交換a[1]和a[2]的值;交換之后,a[1]=30,a[2]=40。
當i=5,j=2時,a[2]>a[3]。此時,交換a[2]和a[3]的值;交換之后,a[2]=10,a[3]=40。
當i=5,j=3時,a[3]<a[4]。此時,不做任何處理!
當i=5,j=4時,a[4]>a[5]。此時,交換a[4]和a[5]的值;交換之后,a[4]=50,a[3]=60。
第一趟排完之后,最大元素60移到數組最后了,也就是a[5]此時為數組中最大的元素,再進行第二趟排序的時候,只需按照上面的方法排前面5個元素就可以了。這樣:
第2趟排序完之后,數列中a[4]、a[5]是有序的。
第3趟排序完之后,數列中a[3]、a[4]、a[5]是有序的。
第4趟排序完之后,數列中a[2]、[3]、a[4]、a[5]是有序的。
第5趟排序完之后,數列中a[1]、a[2]、[3]、a[4]、a[5]是有序的。
第5趟排序之后,整個數列也就是有序的了。
根據上面流程,不難寫出冒泡排序的代碼實現,此處是按升序排列。
void bubble_sort(int a[], int n)
{int i,j;for (i=n-1; i>0; i--){// 將a[0...i]中最大的數據放在末尾for (j=0; j<i; j++){if (a[j] > a[j+1])swap(a[j], a[j+1]);}}
}
其實觀察上面例子冒泡排序的流程圖,第3趟排序之后,數據已經是有序的了;第4趟和第5趟并沒有進行數據交換。因此可以對冒泡排序進行優化,使它效率更高一些:添加一個標記,如果一趟遍歷中發生了交換,則標記為true,否則為false。如果某一趟沒有發生交換,說明排序已經完成,退出。優化后的代碼如下:
void bubble_sort2(int a[], int n)
{int i,j;int flag; // 標記一趟是否發生交換for (i=n-1; i>0; i--){flag = 0; // 初始化標記為0// 將a[0...i]中最大的數據放在末尾for (j=0; j<i; j++){if (a[j] > a[j+1]){swap(a[j], a[j+1]);flag = 1; //發生交換,設flag為1}}if (flag==0)break; // 若無交換,說明數列已有序}
}
冒泡排序的時間復雜度是O(N2):假設被排序的數列中有N個數。遍歷一趟的時間復雜度是O(N),需要遍歷多少次呢?N-1次!因此,冒泡排序的時間復雜度O(N2)。
冒泡排序是穩定的算法:它滿足穩定算法的定義;所謂算法穩定性指的是對于一個數列中的兩個相等的數a[i]=a[j],在排序前,a[i]在a[j]前面,經過排序后a[i]仍然在a[j]前,那么這個排序算法是穩定的。
關于“web開發中冒泡排序是什么意思”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。