选择排序的思想是在一个无序的数列中先找到最小值,其次将其存储到数列的最前列或最后列,达到数列由小到大大或有大到小的排列效果。排序算法在实际应用中是非常实用的,个人主要用于数字滤波。本代码是学习x甲鱼《数据结构与算法》的笔记。代码可以直接复制到Microsoft Visual C++编译软件运行。代码用自己理解的语言做了详细注释。在自己的四轴飞行器电位器调速程序中就运用了该函数。
闲来无聊玩手机时可以看看这个,练练大脑。
- #include<stdio.h>
- void SelectSort(int k[],int n) //在这个函数里,因为没有返回值,所以不能用return语句;int *k也可以
- { /* 根据C语言知识:形参“int k[]”是数组入口地址,每个元素占用4个字节,形参数组共占用4*n个字节 */
- int i,j,temp,min,count1=0,count2=0 ; //加入count1,count2是为了计算程序复杂度
- for(i=0;i<n-1;i++)
- {
- min=i; //保证从首元素开始逐个比较,这一句很重要!
- for(j=i+1;j< n;j++)//“j=i+1”本元素和下一个元素
- {
- // count1++;
-
- if(k[j]<k[min])//注意!这里如果改成“k[j]>k[min]”就是反序排列了!
- {
- /* 如果下一个元素比前一个元素大,就将二者位置交换,确保k[min]是该数列中的最小值 */
- /* 通过这一层for循环将最小值与数列中每个元素比较一次,并交换位置确保将该数列中的最小值存放在i指针处 */
- count1++; //比较次数
- min=j; //貌似简单,却有技术含量!确保k[min]是该轮循环比较中的最小值
- //换句话说,在该轮循环比较中让每一个元素与最小值k[min]比较,最终实现确保k[min]是该数列中的最小值
- }
-
- }
- if(min!=i)//如果min不等于i,说明位置发生了交换;并将最小值交换到数序前列;
- {
- temp=k[min];
- k[min]=k[i];
- k[i]=temp; //将最小值存放在数序前列;
- count2++; //计算交换位置次数
-
- }
- }
- printf("总共进行了%d次比较,进行了%d次移动" ,count1,count2);
- }
- int main(void)//比较,输出最大值
- {
-
- // int m, a[10]={ 0,1,5,4,2,3,6,8 ,7,9};
- // int m, a[10]={ 9,7,0,1,2,3,4,5,6,8 }; //那么排序的效率就大大增加了;
- int m, a[10]={25,10,7,2,34,6,6,8 ,9,0};//那么排序的效率就大大增加了;
- SelectSort( a,10);
- printf("排序后的结果是:\n\r" );
- for(m=0;m<10;m++)
- {
-
- printf("%d\n\r" ,a[m]);
-
- }
- // printf("\n\n" );
-
- return 0; //结束主函数
- }
复制代码
/* 本例程学习:选择排序的效率比优化后的冒泡排序效率略高,更易理解 */
-----王衍
|