例:用选择法对数组中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次比较。