今天我們學習的是c語言中的排序方法
目錄:
一.冒泡排序法
二.選擇排序法
下面我們正式學習c語言中的排序方法
一.冒泡排序法
1.冒泡排序法的過程:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 將無序的數組通過數組之間的大小比較,排成有序的樣子
2.例如:5,3,4,6? --->>3,5,4,6 --->>3,4,5,6 --->>3,4,5,6
? ? ? ? ? ? ?
第一輪排序(將最大值放到末尾)
1. 比較 [**5**, **3**, 4, 6]`→ 5 > 3 → 交換 ?
→ 數組變為 `[3, 5, 4, 6]` ?
2. 比較 [3, **5**, **4**, 6]?→ 5 > 4 → 交換 ?
→ 數組變為 `[3, 4, 5, 6]` ?
3. 比較 [3, 4, **5**, **6**]→ 5 < 6 → 不交換?結果:[3, 4, 5, 6](最大值 6 已在末尾)
---
第二輪排序(檢查剩余部分)
1. 比較 [**3**, **4**, 5, 6]?→ 3 < 4 → 不交換?
2. 比較 [3, **4**, **5**, 6]?→ 4 < 5 → 不交換?結果:[3, 4, 5, 6](無交換,排序完成)
---
最終結果:[3, 4, 5, 6]
3.注意:
? ? ? ? ? ?***若數組中有n個元素,那么需要進行n-1次排序(考慮最壞的情況)
? ? ? ? ? ?***因為每次排序是為了將最值放在數組末尾,所以每次排序只需進行n-a-1次比較(減少不必要的比較)
? ?代碼:
#include <stdio.h>void maopao(int num[],int n)
{for(int a=0;a<n-1;a++){for(int b=0;b<n-a-1;b++){if(num[b]>num[b+1]){int temp=num[b+1];num[b+1]=num[b];numb[b]=temp;}}}
}void prinmao(int num[],int n)
{for(int a=0;a<=n-1;a++){ printf("%d",num[a];}
}int main()
{int num[]={2,6,7,9};int n=sizeof(num)/sizeof(num[0]);maopao(num,n);prinmao(num,n);
}
? ?代碼解析:
1.maopao函數是一個讓數組進行冒泡排序的函數
? ?prinmao函數是一個打印數組的函數
2.n是指num這個函數中元素的個數
? ?所以對num進行冒泡排序只需進行n-1個排序
3.因為每次的排序會把最值放在末尾,所以為了節省空間,只需進行n-a-1個比較
4.因為在我們進行冒泡排序的時候比較方法是這種形式:num[b]>num[b+1],所以我們在進行二次循環的時候應該是b<n-a-1,而不是b<=n-a-1,這樣的目的是為了防止數組的下標溢出,而使用b<n-a-1也能保證每個數都參與了比較
二.選擇排序法
1.選擇排序法的過程:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?假設第1個元素是最值,求第1個元素后面所有元素中比這個元素更最的值,將這個值與第1個元素進行值互換,然后在進行第二個元素,第三個元素------
2.例如:2,4,10,9 --->>10,4,2,9 --->>10,9,2,4 --->>10,9,4,2
第1輪排序**(i=0)
- **未排序部分**:`[**2**, 4, 10, 9]`
- 當前最小值:`2`(索引0)
- 比較過程:
- 2 < 4 → 保持
- 2 < 10 → 保持
- 2 < 9 → 保持
- **無需交換**(最小值已在正確位置)**本輪結果**:`[**2**, 4, 10, 9]` ?
(已排序部分:`[2]`,未排序部分:`[4, 10, 9]`)---
第2輪排序**(i=1)
- **未排序部分**:`[2, **4**, 10, 9]`
- 當前最小值:`4`(索引1)
- 比較過程:
- 4 < 10 → 保持
- 4 < 9 → 保持
- **無需交換**(最小值已在正確位置)**本輪結果**:`[2, **4**, 10, 9]` ?
(已排序部分:`[2, 4]`,未排序部分:`[10, 9]`)---
第3輪排序**(i=2)
- **未排序部分**:`[2, 4, **10**, 9]`
- 當前最小值:`10`(初始索引2)
- 比較過程:
- 10 > 9 → 更新最小值為 `9`(索引3)
- **交換 10 和 9**:
```c
temp = 10;
arr[2] = 9;
arr[3] = 10;**本輪結果**:`[2, 4, **9**, 10]` ?
(已排序部分:`[2, 4, 9]`,未排序部分:`[10]`)### **最終結果**:`[2, 4, 9, 10]` ?
(第4輪無需執行,因為最后一個元素自動就位)3.注意:
? ? ? ? ? ? ***若數組中有n個元素,那么只需進行n-1次排序,因為最后一個元素自動就位
? ? ? ? ? ? ***因為選擇排序是把最值放在數組的前面,所以選擇的元素下標是a+1,為了保證最后一個元素參與了比較,所以第二個循環c<n
? ?代碼:
#include <stdio.h>void xuanze(int num[],int n)
{for(int a=0;a<n-1;a++){int b=a;for(int c=a+1,c<n;c++){ if(num[b]>num[c])b=c;}int temp=num[a];num[a]=num[b];num[b]=temp;}
}void prinxuan(int num[],n)
{for(int a=0;a<=n-1;a++)printf("%d",num[a];
}int mian()
{int num[]={2,10,4,9};int n=sizeof(num)/sizeof(num[0]);xuanze(num,n);prinxuan(num,n);
}
? ?代碼解析:
1.xuanze函數是一個將數組進行選擇排序的函數
? ?prinxuan函數是一個打印數組的函數
2.n是指數組中的元素的個數
? ?所以選擇排序只需進行n-1個排序
3.因為選擇排序選擇的數是根據排序次數來遞進的,所以每個標準數要從c=a+1開始