排序算法01_选择排序

 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 }

 

posted @ 2018-07-14 15:59  张子游zy  阅读(153)  评论(0编辑  收藏  举报