1、普通选择排序
1 //选择排序
2 #include<stdio.h>
3 int main(){
4 int a[10]={45,2,9,0,-3,54,12,5,66,33};
5 int i,j,t;
6 //先将n个数中最小的数与a[0]对换;再将a[1]~a[n-1]中最小的数与a[1]对换,每比较一轮,找出一个未经排序的数中最小的一个
7 //总共有n个数,分别用前面n-1个数与后面未排序的数列进行比较,所以总共循环n-1次
8 for(i=0;i<9;i++){
9 //用i+1后面的数a[j]分别与a[i]进行比较,比较过程从i+1=1开始,至n结束,在下面的循环过程中a[i]始终不变
10 for(j=i+1;j<10;j++){
11 //如果后面的某个数a[j]小于前面的a[i],则进行交换
12 if(a[j]<a[i]){
13 t=a[j];a[j]=a[i];a[i]=t;
14 }
15 }
16 }
17 for(i=0;i<10;i++){
18 printf("%4d",a[i]);
19 }
20 }
2、指针实现的选择排序
1 //用指针来实现选择排序
2 #include<stdio.h>
3 int main(){
4 void sort(int *x,int n);
5 int a[10]={2,4,9,5,8,1,0,3,7,6};
6 int *pa=a;
7 int n=10;
8 sort(pa,n);
9 //用指针输出数组时一定要先执行"pa=a",此程序中不执行此句也可以正确输出,在有的程序中执行到此句时指针pa已经指向了其他位置,需要对指针复位
10 //此句中的循环条件表达式不能使用"pa<pa+10"来判断,这是因为步长表达式执行"pa++"操作,每一次执行完步长表达式之后再执行循环条件表达式时pa的值都会改变,"pa<pa+10"将一直满足条件,无法跳出循环,这一点一定要注意,千万要小心使用
11 for(pa=a;pa<a+10;pa++)
12 printf("%d ",*pa);
13 }
14 void sort(int *x,int n){
15 int temp;
16 //定义三个指针变量pi,pj,pn
17 //pi控制外层循环,变化范围从数组第1个元素到第n-1个元素对应的地址
18 //pj控制内层循环,变化范围从每一次内循环时pi对应的下一个元素到第n个元素对应的地址
19 //pn指向数组最后一个元素
20 int *pi,*pj,*pn;
21 pi=x;
22 pn=x+n;
23 for(pi;pi<pn-1;pi++){
24 for(pj=pi+1;pj<pn;pj++){
25 if(*pi>*pj){
26 temp=*pi;*pi=*pj;*pj=temp;
27 }
28 }
29 }
30 }