最近,开始认真学习算法,为了更好的督促自己学习,也请大家帮忙监督,所以列了出来,欢迎批评指正。
第一个是选择排序
选择排序的基本思想是:设有N个元素要排序,首先选择最大的元素与第一个元素交换,然后再对剩余的N-1个元素进行类似处理,这样重复N-1次后,即可将N个元素按由大到小的顺序排列。若由小到大排序,只需每次选择最小元素。
具体代码如下:
1 #include "Stdio.h" 2 #define N 3 3 void main(void) 4 { 5 int temp,i,j; 6 int arr[N]; 7 for(i=0;i<N;i++) /* 从键盘上输入3个数 */ 8 scanf("%d",&arr[i]); 9 for(j=0;j<N-1;j++) /* 3个元素选择2遍 */ 10 { 11 for(i=j+1;i<N;i++) /* 没遍进行3-(i+1)次 */ 12 { 13 if(arr[i]>arr[j]) /* 把arr[j]当做最大数进行比较 */ 14 temp=arr[i]; 15 arr[i]=arr[j]; 16 arr[j]=temp; 17 } 18 } 19 for(i=0;i<N;i++) 20 { 21 printf("%8d ",arr[i]); 22 } 23 scanf("%d",&temp); 24 }
算法改进:事实上,执行元素的交换并不都是必须的,只要记住比较时大元素的位置,即序号即可,在内循环结束后做一次交换即可,从而提高程序的执行效率。
代码如下:
1 #include "Stdio.h" 2 #define N 3 3 void main(void) 4 { 5 int temp,i,j,k; 6 int arr[N]; 7 for(i=0;i<N;i++) /* 从键盘上输入3个数 */ 8 scanf("%d",&arr[i]); 9 for(j=0;j<N-1;j++) /* 3个元素选择2遍 */ 10 {k=i; 11 for(i=j+1;i<N;i++) 12 { if(a[k]<a[j]) k=j;/* 记住新大元素的序号 */ 13 if(k!=i) 14 { temp=arr[i]; 15 arr[i]=arr[j]; 16 arr[j]=temp;} 17 } 18 } 19 for(i=0;i<N;i++) 20 { 21 printf("%d ",arr[i]); 22 } 23 scanf("%d",&temp); 24 }