选择排序

  1 /* 数组实战 */
  2 
  3 #include<stdio.h>
  4 #include<stdlib.h>
  5 #include<time.h>
  6 
  7 void main()
  8 {
  9     // 越界不一定出错,不越界一定不会发生内存访问冲突
 10     int a[5]={1,2,3,4,5};
 11     for (int i=0;i<10;i++)
 12     {
 13         printf("%d",a[i]);
 14     }
 15 
 16 
 17     system("pause");
 18 }
 19 
 20 //-------------------------------------------------------------------
 21 
 22 void main()
 23 {
 24     int a[10]={10,9,8,7,6,5,4,3,2,1};
 25     for (int i=9;i>=0;i--)// 逆序输出
 26     {
 27         printf("\n%d",a[i]);
 28     }
 29 
 30 
 31     system("pause");
 32 }
 33 
 34 //-------------------------------------------------------------------
 35 
 36 // 查找数据是否存在数组
 37 
 38 void main()
 39 {
 40     time_t ts;
 41     unsigned int data = time(&ts);
 42     srand(data);// 创建随机数种子
 43     int a[100];
 44     for (int i=0;i<100;i++)
 45     {
 46         a[i]= rand()%300;// 创建随机数组
 47         printf("\n%d",a[i]);
 48     }
 49 
 50     int num;
 51     int flag=0;// 假定找不到
 52     scanf("%d",&num);
 53     for (int i=0;i<100;i++)
 54     {
 55         if(num==a[i])
 56         {
 57             flag=1;// 找到
 58             break;
 59         }
 60     }
 61 
 62     if (flag)
 63     {
 64         printf("找到");
 65     }
 66     else
 67     {
 68         printf("找不到");
 69     }
 70 
 71     system("pause");
 72 }
 73 
 74 //-------------------------------------------------------------------
 75 
 76 // 选择法取随机数组的极值
 77 void main()
 78 {
 79     time_t ts;
 80     unsigned int data = time(&ts);
 81     srand(data);// 创建随机数种子
 82     int a[20];
 83     for (int i=0;i<20;i++)
 84     {
 85         a[i]= rand()%300;// 创建随机数组
 86         printf("\n%d",a[i]);
 87     }
 88     
 89     int max=a[0];// 选择法 取最大
 90     for (int i=1;i<20;i++)
 91     {
 92         if(a[i]>max)
 93         {
 94             max = a[i];
 95         }
 96     }
 97     printf("\n%d",max);
 98 
 99 
100     int min=a[0];// 选择法 取最小
101     for (int i=1;i<20;i++)
102     {
103         if(a[i]<min)
104         {
105             min = a[i];
106         }
107     }
108     printf("\n%d",min);
109 
110     
111     system("pause");
112 }
113 
114 //-------------------------------------------------------------------
115 
116 // 选择排序
117 
118 #define N 20
119 void main()
120 {
121     time_t ts;
122     unsigned int data = time(&ts);
123     srand(data);// 创建随机数种子
124     int a[N];
125     for (int i=0;i<N;i++)
126     {
127         a[i]= rand()%300;// 创建随机数组
128         printf("\n%d",a[i]);
129     }
130     
131     int kmax = 0;// 记录最值下标 
132     for (int i=0;i<N-1;i++ )
133     {
134         kmax=i;// 记录最大数的下标
135         for(int j=i+1;j<N;j++)// 遍历剩下的数
136         {
137             if(a[j] > a[kmax])
138             {
139                 kmax = j;// 循环记录最大值得下标
140             }
141         }
142 
143         if (kmax != i)
144         {
145             int temp = a[kmax];// 当i=0,最大值移到a[0],把当前的最大之移到第一位  
146             a[kmax] = a[i];
147             a[i] = temp;
148         }
149     }
150     
151 
152     
153     printf("排序以后:\n");
154 
155     for (int i=0;i<N;i++)
156     {
157         printf("  %d  ",a[i]);
158     }
159     
160     printf("\n");
161 
162 
163     system("pause");
164 }

 

思想:

还是先来看看选择排序的思想。选择排序的思想非常直接,不是要排序么?那好,我就从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。可以很清楚的发现,选择排序是固定位置,找元素。相比于插入排序的固定元素找位置,是两种思维方式。不过条条大路通罗马,两者的目的是一样的。

posted on 2015-06-20 09:46  Dragon-wuxl  阅读(189)  评论(0)    收藏  举报

导航