标题:
C语言选择排序算法 程序源码详细分析
[打印本页]
作者:
piaolin
时间:
2015-10-1 13:38
标题:
C语言选择排序算法 程序源码详细分析
选择排序的思想是在一个无序的数列中先找到最小值,其次将其存储到数列的最前列或最后列,达到数列由小到大大或有大到小的排列效果。排序算法在实际应用中是非常实用的,个人主要用于数字滤波。本代码是学习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; //结束主函数
}
复制代码
/* 本例程学习:选择排序的效率比优化后的冒泡排序效率略高,更易理解 */
-----王衍
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1