冒泡排序法,兩個數組內容的互換,兩個變量之間的交換


兩個變量之間的交換,通過查閱資料,有如下四種常見方法:

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 }

 

運行結果如下:
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM