閱前聲明:如果想直接了解冒泡排序的簡化思想,請跳至文章尾部
在介紹之前,我們先看一個用到該功能的實戰訓練(本人也是從中開始認識到冒泡排序這個函數定義)
對于小白來說,我的思路如下:
1.題目中涉及到三個數組,首先scanf兩個整型變量m,n,其次定義三個變長數組arr[m + n] 、arr1[m] 、arr2[n];
2.我們了解到一個關鍵信息,兩個輸入的數組為升序類型,那么考慮兩個數組中同下標值的元素進行比較,然后根據他們比較的結果在arr中進行元素輸入;
具體操作編碼如下:(為錯誤示范,可以理解和糾正一下編碼思路)
void input_arr(int arr[], int a,int b)
{for (a = 0; a < b; a++){scanf("%d", &arr[a]);}
}
int smaller(int a, int b)
{if (a >= b)return b;elsereturn a;
}
int bigger(int a, int b)
{if (a >= b)return a;elsereturn b;
}
void print(int a , int arr[])
{int i;for (i = 0; i < a; i++){printf("%d ", arr[i]);}
}
int main()
{int m, n;scanf("%d %d", &m, &n);int arr1[m];//先將三個數組定義出來int arr2[n];int arr[m + n];int i,j;input_arr(arr1, i, m);//輸入兩個數組input_arr(arr2, i, n);int b = smaller(m,n);//先比較m,n;用新賦值的變量去參與后續判斷int c = bigger(m,n);for (j = 0; j < c; j++)//利用變量j對arr數組的元素進行輸入{if (j < b)//在相同下標區間內,進行大小判斷,要將兩個同數量的數組比較并放入新的數組中,需要2b個空間,下標位數為2b-1{arr[2 * j ] = smaller(arr1[j], arr2[j]);//先進行一個同下標數的大小判斷,小的放在本位上,大的放在+1位上arr[2 * j + 1] = bigger(arr1[j], arr2[j]);if (j >= 1){arr[2 * j] = bigger(smaller(arr1[j], arr2[j]), arr[2 * j - 1]);//將新的小值與前一次的大值進行比較,糾正排序arr[2 * j - 1] = smaller(smaller(arr1[j], arr2[j]), arr[2 * j - 1]);}}//到這里完成了0-2b-1的數值輸入,共2b個數else if (j == b){if (b == m) //判斷元素數量大的一方數組后,對超出的第一位數組值進行比較{arr[2 * b] = bigger(arr2[b], arr[2 * b - 1]);arr[2 * b - 1] = smaller(arr2[b], arr[2 * b - 1]);}else{arr[2 * b] = bigger(arr1[b], arr[2 * b - 1]);arr[2 * b - 1] = smaller(arr1[b], arr[2 * b - 1]);}}else{if (b == m){arr[2 * b + j - b] = arr2[j];}else{arr[2 * b + j - b] = arr1[j];}}}for (int s = m + n - 1; s > 0; s--){int temp;if (arr[s] < arr[s - 1]){temp = arr[s];arr[s] = arr[s - 1];arr[s - 1] = temp;}}print(m + n, arr);return 0;
}//僅適合升序,且沒有相同數的兩個數組
在這個輸入例子中,編寫的代碼出現了明顯的錯誤,存在交替的大小變化,這是由于下標值相差太多的元素之間存在漏比較的情況,這是由于我們比較方式的局限性導致的,不要簡單的把一個元素集合按照規定的容量分為多個比較區間,進行依次比較后糾正的元素排列就是我們想要的結果,下面是這種錯誤觀念的示意圖
一個數字,確定其在整型數組中正確的大小排序和下標值,應該將其和每一個元素進行比較。
那么我們可以得出冒泡排序的關鍵思想:
假設一個整型數組 中有N個元素,每一個元素確定自己的正確位置需要與剩余的N-1個元素進行比較,而每一個元素都需要完成這個過程 即 實現數組的正確排序,我們需要完成N * (N - 1)次的比較,細分下來就是C語言中的兩個for循環的嵌套使用,具體如下:
for (int a = 0; a < m + n; a++){for (int b = 0; b < m + n - 1; b++){int temp = 0;if (arr[b] > arr[b + 1]){temp = arr[b + 1];//此時的temp僅為存儲數據的一個整型變量,無其他特殊含義arr[b + 1] = arr[b];arr[b] = temp;}}}
因此,我們可以簡化并且加深對冒泡排序這個代碼塊的理解。
有表述不當的地方辛苦不吝賜教,三克油。
打怪升級中..................................................................................................................................