例:用選擇法對數組中10個整數按由小到大排序。
解題思路:
所謂選擇法就是先將10個數中最小的數與a[0]對換,再將a[1]~a[9]中最小的數與a[1]對換······每比較一輪,找出一個未經排序的數中最小的一個。共比較9輪。
如下圖:
a[0] a[1] a[2] a[3] a[4]
3 6 1 9 4
1 6 3 9 4
1 3 6 9 4
1 3 4 9 6
1 3 4 6 9
代碼如下
#include<stdio.h>
2.void sort(int a[],int n)
3.{
4. int i,j,k,t;
5. for(i=0;i<n-1;i++)//因爲i需與後面的元素比較,所以i最多是倒數第二個元素
6. {
7. k=i;
8. for(j=i+1;j<n;j++)//同上,j需與前面的元素比較,所以j最小爲i後的第一個元素
9. {
10. if(a[j]<a[k]) k=j;
11. }
12. t=a[k];a[k]=a[i];a[i]=t;//注意此處只有i和k
13. }
14.}
15.
16.int main()
17.{
18. int s[10],i;
19. for(i=0;i<10;i++)
20. scanf("%d",&s[i]);
21. sort(s,10);
22. for(i=0;i<10;i++)
23. printf("%d ",s[i]);
24. printf("\n");
25. return 0;
26.}
初識sort排序:
一、把i的值賦予k,讓k替i與j比較(爲了不改變i的值);
二、① 如果a[k]大於a[i](此時a[k]即a[i]的值),則用k記錄下j的值,即記錄下需要與a[i]交換的元素的序號
②如果a[k]不大於a[i],此時不需交換故k不需記錄下序號,此時k仍是i的值
三、交換:i變化的每輪都有a[i]與a[k]交換值的環節(即調用的sort函數中的最後一部分),如果是①條件下的k,則a[i]與此時k記錄下序號的元素互換,a[i]換爲兩者的最小值;如果是②條件下的k,則k的值即是i的值,則交換後a[i]值仍爲原值,即不互換。(綜上:k是替死鬼???)
冒泡法:若是if (arr[j]< arr[j+1]) ,則數據從大到小排序,若是if(arr[j] > arr[j+1]) ,則數據從小到大排序。
選擇法:若是if (arr[i] < arr[j]) ,則數據從大到小排序,若是if (arr[i] >arr[j]) ,則數據從小到大排序。
冒泡法與選擇法:若有n個數據,則需進行n-1輪比較,第i輪需進行n-i次比較。