标签:
今天继续介绍一种排序算法:选择排序。
选择排序的基本思想就是从待排序列中选择出最小的,然后将被选出元素和序列的第一个元素互换位置(当前默认是升序排列),则互换完成后第一个元素就是整个序列的最小的元素,则一次选择排序结束。然后我们从剩下的子序列中选择出最小的,然后将该被选出来的元素和该子序列的第一个元素(即整个序列的第二个元素)互换位置,则当前整个序列的第二个元素就是当前序列中的次最小值,第二次选择排序结束。以此类推,直到该待排序列只剩下一个元素后,则整个序列有序。
具体过程如下图所示:
下面就不多说了,直接上代码,里面几乎每句话都有注释:
1 #include <stdio.h> 2 3 /* 4 简单选择排序(假定为升序排列): 5 简单选择排序原理是从当前序列中取出一个最小值,将当前选出的最小值和第一个值互换。然后从剩余序列中再选出最小值,和该序列 6 的第二只互换,直到当前序列只剩下一个值,当前整个序列即为有序序列。 7 */ 8 9 void easySelectSort(int *arr[],int len); 10 int selectMinPos(int arr[],int len,int i); 11 12 13 int main(int argc, char *argv[]) 14 { 15 16 int arr[5]={ 17 3,19,32,1,8 18 }; 19 easySelectSort(arr,5); 20 int i; 21 for(i=0;i<5;i++){ 22 printf("%d ",arr[i]); 23 } 24 25 return 0; 26 } 27 28 /* 29 排序算法 30 */ 31 void easySelectSort(int *arr[],int len){ 32 //因为是从左向右逐渐减一做选择最小值的操作,则必定需要去遍历整个序列 33 int j; //定义一个整形变量j,用来存储被选择出来的最小值的下标 34 int temp; //定义一个临时变量temp用来在互换时存储临时变量 35 int i; 36 for(i=0;i<len;i++){ 37 j=selectMinPos(arr,len,i); //当前方法表示对arr数组从i开始到arr.length-1的序列进行选择最小值的操作,并将下标赋给j 38 39 if(i!=j){ //只有在i和j不等,即被选择出来的最小值的位置不是当前开始的位置时我们才进行元素位置的互换 40 temp=arr[j]; 41 arr[j]=arr[i]; 42 arr[i]=temp; 43 } 44 } 45 } 46 47 /* 48 选择最小元素位置的方法 49 arr:被选择的数组 50 i:从什么下标开始到arr.length-1的被选择序列 51 */ 52 int selectMinPos(int arr[],int len,int i){ 53 int pos=i; //定义一个pos位置变量,并默认赋值为i 54 for(i;i<len;i++){ 55 /** 56 我们从pos(即i)开始作比较,只有当所对应的数组值大于i对应的变量值时,将pos=i;这就相当于我们先假定pos(即i)下标 57 对应的数组值是最小的,然后逐一拿着后边的(i++)值和当前pos下标对应的值作比较,发现更下的就将i赋给pos,这样遍历一遍 58 之后就能找到最终的最小的值对应的下标 59 */ 60 if(arr[pos]>arr[i]){ 61 pos=i; 62 } 63 } 64 return pos; 65 }
以上就是选择排序算法的原理、图示以及代码实现,这也只是我自己的理解,如果有不对的地方还请大家指出来。
以上博文系博主原创,转载请标明出处,谢谢。
标签:
原文地址:http://www.cnblogs.com/WuNaiHuaLuo/p/5393401.html