兩個變量之間的交換,通過查閱資料,有如下四種常見方法:
1.利用一個中間變量實現交換
int a, b;
int temp;
temp = a;
a = b;
b = temp;
2.利用+-操作實現
int a, b; //a = 1 b = 2
a = a + b; //a = 3 b = 2
b = a - b; //b = 1 a = 3
a = a - b; //a = 2 b = 1
3.利用乘除操作實現
int a, b;
a = a * b;
b = a / b;
a = a / b;
4.利用異或操作實現(當a,b相等時,不可用)
int a, b;
a = a ^ b;
b = a ^ b;
a = a ^ b;
數組的冒泡排序法:
冒泡排序是最簡單的排序方法,理解起來容易。雖然它的計算步驟比較多,不是最快的,但它是最基本的,初學者一定要掌握。
冒泡排序的原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右邊冒出來。
以從小到大排序為例,第一輪比較后,所有數中最大的那個數就會浮到最右邊;第二輪比較后,所有數中第二大的那個數就會浮到倒數第二個位置……就這樣一輪一輪地比較,最后實現從小到大排序。
比如對下面這個序列進行從小到大排序:90 21 132 -58 34
第一輪:
1) 90 和 21比,90>21,則它們互換位置:21 90 132 -58 34
2) 90 和 132 比,90<132,則不用交換位置。
3)132 和 –58 比,132>–58,則它們互換位置:21 90 -58 132 34
4)132 和 34 比,132>34,則它們互換位置:
21 90 -58 34 132
到此第一輪就比較完了。第一輪的結果是找到了序列中最大的那個數,並浮到了最右邊。
比較時,每輪中第 n 次比較是新序列中第 n 個元素和第 n+1 個元素的比較(假如 n 從 1 開始)。
第二輪:
1) 21 和 90 比,21<90,則不用交換位置。
2) 90 和 –58 比,90>–58,則它們互換位置:21 -58 90 34 132
3) 90 和 34 比,90>34,則它們互換位置:
21 -58 34 90 132
到此第二輪就比較完了。第二輪的結果是找到了序列中第二大的那個數,並浮到了最右邊第二個位置。
第三輪:
1) 21 和 –58 比,21>–58,則它們互換位置:-58 21 34 90 132
2) 21 和 34 比,21<34,則不用交換位置。到此第三輪就比較完了。第三輪的結果是找到了序列中第三大的那個數,並浮到了最右邊第三個位置。第四輪:1) –58 和 21 比,–58<21,則不用交換位置。至此,整個序列排序完畢。從小到大的序列就是“–58 21 34 90 132”。從這個例子中還可以總結出,如果有 n 個數據,那么只需要比較 n–1 輪。而且除了第一輪之外,每輪都不用全部比較。因為經過前面輪次的比較,已經比較過的輪次已經找到該輪次中最大的數並浮到右邊了,所以右邊的數不用比較也知道是大的
拓展:
通過在vs上調試:運用了引用第三變量和異或法分別調試
引入第三變量法:
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int i, j, tem; 6 int arr1[] = { 81, 51, 62, 84, 74, 21, 32, 16, 58, 63, 19, 54, 23, 98, 47, 55 }; 7 for (i = 0; i< 15; i++){ 8 for (j = 0; j < 15 - i; j++){ 9 if (arr1[j] < arr1[j + 1]){ 10 tem = arr1[j]; 11 arr1[j] = arr1[j + 1]; 12 arr1[j + 1] = tem; 13 } 14 } 15 } 16 for (i = 0; i < 15; i++){ 17 printf("%d\n", arr1[i]); 18 } 19 system("pause"); 20 return 0; 21 }

1 冒泡排序法 2 #include <stdio.h> 3 #include <stdlib.h> 4 int main() 5 { 6 int i, j, k; 7 int arr[] = { 8, 6, 7, 86, 9, 3, 69 }; 8 k = sizeof(arr) / sizeof(arr[0]); 9 for (i = 1; i <k ; i++){ 10 for (j = 0; j < k-i; j++){ 11 if (arr[j]>arr[j + 1]){ 12 arr[j + 1] = arr[j+1]^arr[j]; 13 arr[j] = arr[j + 1]^arr[j]; 14 arr[j + 1] = arr[j + 1] ^ arr[j]; 15 } 16 } 17 } 18 for (i = 0; i < k; i++){ 19 printf("%d\n", arr[i]); 20 } 21 system("pause"); 22 return 0; 23 }

程序中,為什么每輪比較的次數是 j<k-i,而不是 j<k–1?
因為冒泡排序有一個特點,這個程序是從大到小排序,所以第一輪排序以后,
最小的數就會浮到最右面;第二輪排序以后,第二小的數會浮到倒數第二個位置;
第三輪排序以后,第三小的數會浮到倒數第三個位置……也就是說,排序多少輪,
就有多少個數字已經按排序要求排好了,它們不需要再比較。寫 j<k–1 也可以,
只不過程序在執行時多做了許多無用功
1 #include <stdio.h> 2 int main() 3 { 4 int arr1[] = { 1, 3, 5, 7, 9 }; 5 int arr2[] = { 3, 4, 5, 6, 7 }; 6 int tmp; 7 int i = 0; 8 for (i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++) 9 { 10 tmp = arr1[i]; 11 arr1[i] = arr2[i]; 12 arr2[i] = tmp; 13 } 14 for (i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++) 15 { 16 printf("%d ", arr1[i]); 17 } 18 printf("\n"); 19 for (i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++) 20 { 21 printf("%d ", arr2[i]); 22 } 23 printf("\n"); 24 return 0; 25 }
加減法:
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int arr1[] = { 2, 3, 5, 6, 4, 7, 8, 9, 11 }; 6 int arr2[]= {5, 6, 9, 8, 7, 1, 2, 3, 44}; 7 int i; 8 for (i = 0; i < 9; i++){ 9 arr1[i] = arr1[i] + arr2[i]; 10 arr2[i] = arr1[i] - arr2[i]; 11 arr1[i] = arr1[i] - arr2[i]; 12 } 13 for (i = 0; i < 9; i++){ 14 printf("%d ", arr1[i]); 15 } 16 printf("\n"); 17 for (i = 0; i < 9; i++){ 18 printf("%d ", arr2[i]); 19 } 20 21 system("pause"); 22 return 0; 23 }
異或法:
1 用異或法互換 2 #include <stdio.h> 3 #include <stdlib.h> 4 int main() 5 { 6 int arr1[] = { 2, 3, 5, 6, 4, 7, 8, 9, 11 }; 7 int arr2[] = { 5, 6, 9, 8, 7, 1, 2, 3, 44 }; 8 int i; 9 for (i = 0; i < 9; i++){ 10 arr1[i] = arr1[i] ^ arr2[i]; 11 arr2[i] = arr1[i] ^ arr2[i]; 12 arr1[i] = arr1[i] ^ arr2[i]; 13 14 } 15 for (i = 0; i < 9; i++){ 16 printf("%d ", arr1[i]); 17 } 18 printf("\n"); 19 for (i = 0; i < 9; i++){ 20 printf("%d ", arr2[i]); 21 } 22 23 system("pause"); 24 return 0; 25 }


