c语言冒泡排序算法解析
冒泡排序算法:
冒泡排序。就是它進行兩個兩個的比較如果發生了逆序,就進行交換。這里以大的數字放在最右邊,小的在最左邊先看一組數字:3,10,5,16,9,12,7,冒泡排序進行就是相鄰的元素兩兩比較。
比較結果:
第一次 3,5,10,9,12, 7, 16
第二次 3,5,9,10,7, 12 ,16
第三次 3,5,9,7,10 ,12 ,16
第四次 3,5,7,9,10, 12, 16
從這里我們就可以看出端倪,在整個的排序過程中,相鄰兩個進行比較的時候我們要使用一次內部循環,在進行排序操作的時候我們還需要進行一次外部循環,才可以最后得出結果。
源代碼:
#include <stdio.h> #include <stdlib.h> #include <time.h>void swap(int arr_01[],int n); void fuzhi(int arr_03[],int n);int main() {int i;int arr[10]={0};fuzhi(arr,10);for(i=0;i<10;i++){printf("排序前(隨機產生):arr[%d]=%d \n",i,arr[i]);}swap(arr,10);printf("\n");for(i=0;i<10;i++){printf("排序后(升序排列):arr[%d]=%d \n",i,arr[i]);}return 0; } void fuzhi(int arr_03[],int n) {int i;srand(time(0));for(i=0;i<n;i++){arr_03[i]=rand()%99+1;} }void swap(int arr_01[],int n) {int i,j,temp;for(i=0;i<n-1;i++)//比較的輪數 {for(j=0;j<n-1;j++)//每進行一輪比較,前一個小的元素和后一個較大的元素交換一下位置 {if(arr_01[j]>arr_01[j+1]){temp=arr_01[j];arr_01[j]=arr_01[j+1];arr_01[j+1]=temp;} } } }運行結果:
核心的算法就是利用了兩次for循環:
for(i=0;i<n-1;i++)//比較的輪數 {for(j=0;j<n-1;j++)//每進行一輪比較,前一個小的元素和后一個較大的元素交換一下位置 {if(arr_01[j]>arr_01[j+1]){temp=arr_01[j];arr_01[j]=arr_01[j+1];arr_01[j+1]=temp;} } }起初我一直不太理解為啥要用到兩次循環,這里借用一位博主的巧妙比喻,理解之后,便豁然開朗。
首先:嵌套是這么理解的。比如你有10棵樹,每天都去檢查是否生蟲子了,連續檢查一個月(30天)
用代碼表示這個循環就是這樣:
for(j=1;j<=30;j++){for(i=1;i<=10;i++){print("今天是第%d天, 正在檢查第%d棵樹",j,i);}}外層循環用戶控制天,內層循環用于控制樹,缺一不可,第一天檢查十遍,第二天檢查十遍,...
也就是j=1的時候內層循環執行一遍,j=2的時候內層循環執行一遍...
對于冒泡排序,可以這樣考慮:
外層循環式控制一共有多少個泡需要排序, 這個當然要用循環,內層循環控制把某一個泡放到正確的位置, 這個也要用循環, 因為這個泡要和所有未排序泡比較一遍, 然后才能知道自己應該處的位置
這里有兩個點,明白了的話,這道題就明白了。
1. 外層循環: 僅僅控制一共有多少個泡需要排序, 比如代碼中a[10], 一共是10個元素
2. 內層循環: 僅僅控制把當前最大的泡放到最后, 也就是一次內層循環,僅僅把最大的那個泡放到最后了而已
把1和2綜合起來看,當j=0時,把a數組10個元素中最大的泡放到最后,當j=1時,把a數組10個元素中第二大的元素放到倒數第二個位置,依次類推..直到第10大的元素,即最小的元素放到正數第一個位置,可以這樣測試一下,會更加清晰,把第一個循環去掉, 內層循環改為:for(i=0; i< 10; i++) 相當于僅執行上述j=0的一次內層循環, 這個循環的作用是把最大的元素放到最后。
這是我把外層循環注釋掉之后的結果,可以看到輸出的結果只是把最大的“泡”放到了最后,其他位置沒有更改。
總結
以上是生活随笔為你收集整理的c语言冒泡排序算法解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php去除emoji表情代码
- 下一篇: js 编译emoji表情