如何在C語(yǔ)言中對(duì)數(shù)組元素進(jìn)行冒泡排序?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
創(chuàng)新互聯(lián)公司擁有10余年的建站服務(wù)經(jīng)驗(yàn),在此期間,我們發(fā)現(xiàn)較多的客戶在挑選建站服務(wù)商前都非常的猶豫。主要問(wèn)題集中:在無(wú)法預(yù)知自己的網(wǎng)站呈現(xiàn)的效果是什么樣的?也無(wú)法判斷選擇的服務(wù)商設(shè)計(jì)出來(lái)的網(wǎng)頁(yè)效果自己是否會(huì)滿意?創(chuàng)新互聯(lián)公司業(yè)務(wù)涵蓋了互聯(lián)網(wǎng)平臺(tái)網(wǎng)站建設(shè)、移動(dòng)平臺(tái)網(wǎng)站制作、網(wǎng)絡(luò)推廣、按需定制設(shè)計(jì)等服務(wù)。創(chuàng)新互聯(lián)公司網(wǎng)站開(kāi)發(fā)公司本著不拘一格的網(wǎng)站視覺(jué)設(shè)計(jì)和網(wǎng)站開(kāi)發(fā)技術(shù)相結(jié)合,為企業(yè)做網(wǎng)站提供成熟的網(wǎng)站設(shè)計(jì)方案。在實(shí)際開(kāi)發(fā)中,有很多場(chǎng)景需要我們將數(shù)組元素按照從大到?。ɑ蛘邚男〉酱螅┑捻樞蚺帕校@樣在查閱數(shù)據(jù)時(shí)會(huì)更加直觀,例如:
一個(gè)保存了班級(jí)學(xué)號(hào)的數(shù)組,排序后更容易分區(qū)好學(xué)生和壞學(xué)生;
一個(gè)保存了商品單價(jià)的數(shù)組,排序后更容易看出它們的性價(jià)比。
對(duì)數(shù)組元素進(jìn)行排序的方法有很多種,比如冒泡排序、歸并排序、選擇排序、插入排序、快速排序等,其中最經(jīng)典最需要掌握的是「冒泡排序」。
以從小到大排序?yàn)槔?,冒泡排序的整體思想是這樣的:
從數(shù)組頭部開(kāi)始,不斷比較相鄰的兩個(gè)元素的大小,讓較大的元素逐漸往后移動(dòng)(交換兩個(gè)元素的值),直到數(shù)組的末尾。經(jīng)過(guò)第一輪的比較,就可以找到較大的元素,并將它移動(dòng)到最后一個(gè)位置。
第一輪結(jié)束后,繼續(xù)第二輪。仍然從數(shù)組頭部開(kāi)始比較,讓較大的元素逐漸往后移動(dòng),直到數(shù)組的倒數(shù)第二個(gè)元素為止。經(jīng)過(guò)第二輪的比較,就可以找到次大的元素,并將它放到倒數(shù)第二個(gè)位置。
以此類推,進(jìn)行 n-1(n 為數(shù)組長(zhǎng)度)輪“冒泡”后,就可以將所有的元素都排列好。
整個(gè)排序過(guò)程就好像氣泡不斷從水里冒出來(lái),較大的先出來(lái),次大的第二出來(lái),最小的最后出來(lái),所以將這種排序方式稱為冒泡排序(Bubble Sort)。
下面我們以“3 2 4 1”為例對(duì)冒泡排序進(jìn)行說(shuō)明。
第一輪 排序過(guò)程
3 2 4 1 (最初)
2 3 4 1 (比較3和2,交換)
2 3 4 1 (比較3和4,不交換)
2 3 1 4 (比較4和1,交換)
第一輪結(jié)束,較大的數(shù)字 4 已經(jīng)在最后面,因此第二輪排序只需要對(duì)前面三個(gè)數(shù)進(jìn)行比較。
第二輪 排序過(guò)程
2 3 1 4 (第一輪排序結(jié)果)
2 3 1 4 (比較2和3,不交換)
2 1 3 4 (比較3和1,交換)
第二輪結(jié)束,次大的數(shù)字 3 已經(jīng)排在倒數(shù)第二個(gè)位置,所以第三輪只需要比較前兩個(gè)元素。
第三輪 排序過(guò)程
2 1 3 4 (第二輪排序結(jié)果)
1 2 3 4 (比較2和1,交換)
至此,排序結(jié)束。
對(duì)擁有 n 個(gè)元素的數(shù)組 R[n] 進(jìn)行 n-1 輪比較。
第一輪,逐個(gè)比較 (R[1], R[2]), (R[2], R[3]), (R[3], R[4]), ……. (R[N-1], R[N]),較大的元素被移動(dòng)到 R[n] 上。
第二輪,逐個(gè)比較 (R[1], R[2]), (R[2], R[3]), (R[3], R[4]), ……. (R[N-2], R[N-1]),次大的元素被移動(dòng)到 R[n-1] 上。
。。。。。。
以此類推,直到整個(gè)數(shù)組從小到大排序。
具體的代碼實(shí)現(xiàn)如下所示:
#includeint main(){ int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9}; int i, j, temp; //冒泡排序算法:進(jìn)行 n-1 輪比較 for(i=0; i<10-1; i++){ //每一輪比較前 n-1-i 個(gè),也就是說(shuō),已經(jīng)排序好的最后 i 個(gè)不用比較 for(j=0; j<10-1-i; j++){ if(nums[j] > nums[j+1]){ temp = nums[j]; nums[j] = nums[j+1]; nums[j+1] = temp; } } } //輸出排序后的數(shù)組 for(i=0; i<10; i++){ printf("%d ", nums[i]); } printf("\n"); return 0; }
運(yùn)行結(jié)果:
1 2 3 4 5 6 7 8 9 10
上面的算法是大部分教材中提供的算法,其中有一點(diǎn)是可以優(yōu)化的:當(dāng)比較到第 i 輪的時(shí)候,如果剩下的元素已經(jīng)排序好了,那么就不用再繼續(xù)比較了,跳出循環(huán)即可,這樣就減少了比較的次數(shù),提高了執(zhí)行效率。
未經(jīng)優(yōu)化的算法一定會(huì)進(jìn)行 n-1 輪比較,經(jīng)過(guò)優(yōu)化的算法最多進(jìn)行 n-1 輪比較,高下立判。
優(yōu)化后的算法實(shí)現(xiàn)如下所示:
#includeint main(){ int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9}; int i, j, temp, isSorted; //優(yōu)化算法:最多進(jìn)行 n-1 輪比較 for(i=0; i<10-1; i++){ isSorted = 1; //假設(shè)剩下的元素已經(jīng)排序好了 for(j=0; j<10-1-i; j++){ if(nums[j] > nums[j+1]){ temp = nums[j]; nums[j] = nums[j+1]; nums[j+1] = temp; isSorted = 0; //一旦需要交換數(shù)組元素,就說(shuō)明剩下的元素沒(méi)有排序好 } } if(isSorted) break; //如果沒(méi)有發(fā)生交換,說(shuō)明剩下的元素已經(jīng)排序好了 } for(i=0; i<10; i++){ printf("%d ", nums[i]); } printf("\n"); return 0; }
我們額外設(shè)置了一個(gè)變量 isSorted,用它作為標(biāo)志,值為“真”表示剩下的元素已經(jīng)排序好了,值為“假”表示剩下的元素還未排序好。
每一輪比較之前,我們預(yù)先假設(shè)剩下的元素已經(jīng)排序好了,并將 isSorted 設(shè)置為“真”,一旦在比較過(guò)程中需要交換元素,就說(shuō)明假設(shè)是錯(cuò)的,剩下的元素沒(méi)有排序好,于是將 isSorted 的值更改為“假”。
每一輪循環(huán)結(jié)束后,通過(guò)檢測(cè) isSorted 的值就知道剩下的元素是否排序好。
關(guān)于如何在C語(yǔ)言中對(duì)數(shù)組元素進(jìn)行冒泡排序問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。