南京做網(wǎng)站南京樂識最優(yōu)如何快速推廣自己的品牌
一.前情提要
1.介紹
冒泡法排序法:
1)冒泡排序(Bubble Sort)是一種簡單的排序算法,它重復(fù)地遍歷要排序的列表,一次比較相鄰的兩個元素,并且如果它們的順序錯誤就將它們交換過來。重復(fù)這個過程直到?jīng)]有需要交換的元素,即可完成排序。
2)這個算法的名字來自于在排序過程中較大的元素會經(jīng)由交換“冒泡”到數(shù)列的頂端,而較小的元素則會慢慢“沉”到數(shù)列的底端。
3)下面是冒泡排序的基本步驟:
①比較相鄰的兩個元素。如果第一個比第二個大(升序排序),則交換它們。
②對每一對相鄰元素重復(fù)上述步驟,直到?jīng)]有任何一對元素需要比較。
③重復(fù)步驟1和2,直到整個列表都已經(jīng)排好序。
4)示例圖(借鑒了C語言——冒泡排序_冒泡排序c語言-CSDN博客)----->?如有侵權(quán)聯(lián)系作者刪除
二.具體代碼
#include <stdio.h>
// 定義冒泡排序函數(shù)
void bubbleSort(int arr[], int n) {
????int i, j, temp;
????for (i = 0; i < n - 1; i++) {
????????for (j = 0; j < n - i - 1; j++) {
????????????// 如果當(dāng)前元素大于后面的元素,則交換它們
????????????if (arr[j] > arr[j + 1]) {
????????????????temp = arr[j];
????????????????arr[j] = arr[j + 1];
????????????????arr[j + 1] = temp;
????????????}
????????}
????}
}
int main() {
????int arr[] = {64, 34, 25, 12, 22, 11, 90};
????int n = sizeof(arr) / sizeof(arr[0]);
????int i;
????printf("原始數(shù)組: \n");
????for (i = 0; i < n; i++) {
????????printf("%d ", arr[i]);
????}
????printf("\n");
????bubbleSort(arr, n);
????printf("排序后的數(shù)組: \n");
????for (i = 0; i < n; i++) {
????????printf("%d ", arr[i]);
????}
????printf("\n");
????return 0;
}
三.代碼解析
1.流程:冒泡排序是一種簡單的排序算法,bubbleSort()中通過多次遍歷數(shù)組,比較相鄰元素的大小并交換它們,從而將最大的元素逐步“冒泡”到數(shù)組的末尾。這個函數(shù)接受一個整型數(shù)組 arr?和數(shù)組的長度 n,并對數(shù)組進(jìn)行排序。具體實現(xiàn)是通過兩層嵌套的循環(huán),外層循環(huán)控制每一輪的比較次數(shù),內(nèi)層循環(huán)用于比較相鄰元素并進(jìn)行交換。主函數(shù) main(),它定義了一個整型數(shù)組 arr,并初始化了一些數(shù)據(jù)。然后通過 sizeof?運算符計算了數(shù)組的長度,并將其賦值給變量 n。接著,它使用 printf()?函數(shù)打印出原始數(shù)組的內(nèi)容。然后調(diào)用了 bubbleSort()?函數(shù)對數(shù)組進(jìn)行排序。最后,再次使用 printf()?函數(shù)打印出排序后的數(shù)組內(nèi)容。
2.細(xì)節(jié):(為什么 i < n - 1,j < n - i - 1?等)
①外層循環(huán)的終止條件是 i < n - 1?,原因是因為在每一輪遍歷中,內(nèi)層循環(huán)會比較相鄰的兩個元素,并將較大的元素向數(shù)組的末尾移動。因此,每經(jīng)過一輪遍歷,最大的元素就會被“冒泡”到數(shù)組的最后一個位置上。假設(shè)數(shù)組的長度為 n,在經(jīng)過 n - 1?輪遍歷后,數(shù)組中的最后一個元素已經(jīng)是最大的元素了,不需要再進(jìn)行比較和交換。因此,外層循環(huán)的終止條件是 i < n - 1,這樣可以確保在最后一輪遍歷時,內(nèi)層循環(huán)不會執(zhí)行多余的比較和交換操作,提高了算法的效率。
②內(nèi)層循環(huán)的終止條件是 j < n - i - 1。因為在每一輪外層循環(huán)中,內(nèi)層循環(huán)需要比較相鄰的元素,并將較大的元素向右移動,直到最大的元素移動到當(dāng)前未排序部分的最后一個位置。當(dāng)外層循環(huán)執(zhí)行到第 i?次時,表示數(shù)組的后 i?個元素已經(jīng)處于正確的位置,無需再參與比較和交換。因此,在內(nèi)層循環(huán)中,需要避免對這些已經(jīng)排好序的元素進(jìn)行比較和交換。具體來說,每一輪內(nèi)層循環(huán)中,都會從數(shù)組的第一個元素開始比較,直到倒數(shù)第 i + 1?個元素為止。因此,內(nèi)層循環(huán)的終止條件是 j < n - i - 1,以確保不會對已經(jīng)排好序的元素進(jìn)行多余的比較和交換,提高算法的效率。
③n = sizeof(arr) / sizeof(arr[0])的作用是計算數(shù)組 arr?的長度。在C 語言中,可以使用 sizeof?運算符來獲取變量或類型所占據(jù)的字節(jié)數(shù)。在這里,sizeof(arr)?返回整個數(shù)組 arr?占據(jù)的字節(jié)數(shù),而 sizeof(arr[0])?返回數(shù)組中第一個元素 arr[0]?的字節(jié)數(shù)。由于數(shù)組中的每個元素都是相同類型的,因此數(shù)組中每個元素占據(jù)的字節(jié)數(shù)都相同。通過將整個數(shù)組的字節(jié)數(shù)除以一個元素的字節(jié)數(shù),可以得到數(shù)組中元素的個數(shù),也就是數(shù)組的長度。
④
而temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
這段代碼中,首先將數(shù)組中索引為 j?的元素的值保存到臨時變量 temp?中。然后將數(shù)組中索引為 j + 1?的元素的值賦給索引為 j?的位置,實現(xiàn)了將后一個元素的值賦給前一個元素。最后,將臨時變量 temp?中保存的值賦給索引為 j + 1?的位置,實現(xiàn)了將前一個元素的值賦給后一個元素,從而完成了兩個元素值的交換。這段代碼通常用于實現(xiàn)冒泡排序算法中的元素交換操作。