日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言冒泡排序算法解析

發(fā)布時間:2024/8/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言冒泡排序算法解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

冒泡排序算法:

冒泡排序。就是它進行兩個兩個的比較如果發(fā)生了逆序,就進行交換。這里以大的數(shù)字放在最右邊,小的在最左邊先看一組數(shù)字:3,10,5,16,9,12,7,冒泡排序進行就是相鄰的元素兩兩比較。

比較結(jié)果:
第一次 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

從這里我們就可以看出端倪,在整個的排序過程中,相鄰兩個進行比較的時候我們要使用一次內(nèi)部循環(huán),在進行排序操作的時候我們還需要進行一次外部循環(huán),才可以最后得出結(jié)果。

源代碼:

#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("排序前(隨機產(chǎn)生):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++)//比較的輪數(shù) {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;} } } }

運行結(jié)果:

核心的算法就是利用了兩次for循環(huán):

for(i=0;i<n-1;i++)//比較的輪數(shù) {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;} } }

起初我一直不太理解為啥要用到兩次循環(huán),這里借用一位博主的巧妙比喻,理解之后,便豁然開朗。

首先:嵌套是這么理解的。比如你有10棵樹,每天都去檢查是否生蟲子了,連續(xù)檢查一個月(30天)

用代碼表示這個循環(huán)就是這樣:

for(j=1;j<=30;j++){for(i=1;i<=10;i++){print("今天是第%d天, 正在檢查第%d棵樹",j,i);}}

外層循環(huán)用戶控制天,內(nèi)層循環(huán)用于控制樹,缺一不可,第一天檢查十遍,第二天檢查十遍,...

也就是j=1的時候內(nèi)層循環(huán)執(zhí)行一遍,j=2的時候內(nèi)層循環(huán)執(zhí)行一遍...

對于冒泡排序,可以這樣考慮:

外層循環(huán)式控制一共有多少個泡需要排序, 這個當然要用循環(huán),內(nèi)層循環(huán)控制把某一個泡放到正確的位置, 這個也要用循環(huán), 因為這個泡要和所有未排序泡比較一遍, 然后才能知道自己應(yīng)該處的位置

這里有兩個點,明白了的話,這道題就明白了。

1. 外層循環(huán): 僅僅控制一共有多少個泡需要排序, 比如代碼中a[10], 一共是10個元素

2. 內(nèi)層循環(huán): 僅僅控制把當前最大的泡放到最后, 也就是一次內(nèi)層循環(huán),僅僅把最大的那個泡放到最后了而已

把1和2綜合起來看,當j=0時,把a數(shù)組10個元素中最大的泡放到最后,當j=1時,把a數(shù)組10個元素中第二大的元素放到倒數(shù)第二個位置,依次類推..直到第10大的元素,即最小的元素放到正數(shù)第一個位置,可以這樣測試一下,會更加清晰,把第一個循環(huán)去掉, 內(nèi)層循環(huán)改為:for(i=0; i< 10; i++) 相當于僅執(zhí)行上述j=0的一次內(nèi)層循環(huán), 這個循環(huán)的作用是把最大的元素放到最后。

這是我把外層循環(huán)注釋掉之后的結(jié)果,可以看到輸出的結(jié)果只是把最大的“泡”放到了最后,其他位置沒有更改。

總結(jié)

以上是生活随笔為你收集整理的c语言冒泡排序算法解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。