1. 程式人生 > >陣列的冒號排序法,兩個陣列內容的互換,兩個變數之間的交換

陣列的冒號排序法,兩個陣列內容的互換,兩個變數之間的交換

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

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 輪。而且除了第一輪之外,每輪都不用全部比較。因為經過前面輪次的比較,已經比較過的輪次已經找到該輪次中最大的數並浮到右邊了,所以右邊的數不用比較也知道是大的。

下面寫一個程式:

  1. # include <stdio.h>
  2. int main(void)
  3. {
  4. int a[] {90023-583476324356-7035-2345325432500};
  5. int n//存放陣列a中元素的個數
  6. int i//比較的輪數
  7. int j//每輪比較的次數
  8. int buf//交換資料時用於存放中間資料
  9. sizeof(asizeof(a[0]); /*a[0]是int型, 佔4位元組, 所以總的位元組數除以4等於元素的個數*/
  10. for (i=0; i<n-1++i//比較n-1輪
  11. {
  12. for (j=0; j<n-1-i++j//每輪比較n-1-i次,
  13. {
  14. if (a[j< a[j+1])
  15. {
  16. buf = a[j];
  17. a[j= a[j+1];
  18. a[j+1= buf;
  19. }
  20. }
  21. }
  22. for (i=0; i<n++i)
  23. {
  24. printf("%d\x20", a[i]);
  25. }
  26. printf("\n");
  27. return 0;
  28. }

輸出結果是:
2500 900 543 532 76 56 43 35 34 32 3 2 -58 -70 -234

程式中,為什麼每輪比較的次數是 j<n–1–i,而不是 j<n–1?

因為氣泡排序有一個特點,這個程式是從大到小排序,所以第一輪排序以後,最小的數就會浮到最右面;第二輪排序以後,第二小的數會浮到倒數第二個位置;第三輪排序以後,第三小的數會浮到倒數第三個位置……也就是說,排序多少輪,就有多少個數字已經按排序要求排好了,它們不需要再比較。寫 j<n–1 也可以,只不過程式在執行時多做了許多無用功。

 

  通過在vs上除錯:運用了引用第三變數和異或法分別除錯

 

執行結果一樣           兩個陣列內容的互換  

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 輪。而且除了第一輪之外,每輪都不用全部比較。因為經過前面輪次的比較,已經比較過的輪次已經找到該輪次中最大的數並浮到右邊了,所以右邊的數不用比較也知道是大的。

下面寫一個程式:

  1. # include <stdio.h>
  2. int main(void)
  3. {
  4. int a[] {90023-583476324356-7035-2345325432500};
  5. int n//存放陣列a中元素的個數
  6. int i//比較的輪數
  7. int j//每輪比較的次數
  8. int buf//交換資料時用於存放中間資料
  9. sizeof(asizeof(a[0]); /*a[0]是int型, 佔4位元組, 所以總的位元組數除以4等於元素的個數*/
  10. for (i=0; i<n-1++i//比較n-1輪
  11. {
  12. for (j=0; j<n-1-i++j//每輪比較n-1-i次,
  13. {
  14. if (a[j< a[j+1])
  15. {
  16. buf = a[j];
  17. a[j= a[j+1];
  18. a[j+1= buf;
  19. }
  20. }
  21. }
  22. for (i=0; i<n++i)
  23. {
  24. printf("%d\x20", a[i]);
  25. }
  26. printf("\n");
  27. return 0;
  28. }

輸出結果是:
2500 900 543 532 76 56 43 35 34 32 3 2 -58 -70 -234

程式中,為什麼每輪比較的次數是 j<n–1–i,而不是 j<n–1?

因為氣泡排序有一個特點,這個程式是從大到小排序,所以第一輪排序以後,最小的數就會浮到最右面;第二輪排序以後,第二小的數會浮到倒數第二個位置;第三輪排序以後,第三小的數會浮到倒數第三個位置……也就是說,排序多少輪,就有多少個數字已經按排序要求排好了,它們不需要再比較。寫 j<n–1 也可以,只不過程式在執行時多做了許多無用功。

 

  通過在vs上除錯:運用了引用第三變數和異或法分別除錯