找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2999|回复: 0
收起左侧

C语言选择排序算法 程序源码详细分析

[复制链接]
ID:91350 发表于 2015-10-1 13:38 | 显示全部楼层 |阅读模式
        选择排序的思想是在一个无序的数列中先找到最小值,其次将其存储到数列的最前列或最后列,达到数列由小到大大或有大到小的排列效果。排序算法在实际应用中是非常实用的,个人主要用于数字滤波。本代码是学习x甲鱼《数据结构与算法》的笔记。代码可以直接复制到Microsoft Visual C++编译软件运行。代码用自己理解的语言做了详细注释。在自己的四轴飞行器电位器调速程序中就运用了该函数。

       闲来无聊玩手机时可以看看这个,练练大脑。
      

  1. #include<stdio.h>
  2. void SelectSort(int k[],int n)  //在这个函数里,因为没有返回值,所以不能用return语句;int *k也可以
  3. {               /* 根据C语言知识:形参“int k[]”是数组入口地址,每个元素占用4个字节,形参数组共占用4*n个字节 */
  4.      int i,j,temp,min,count1=0,count2=0 ;      //加入count1,count2是为了计算程序复杂度
  5.    for(i=0;i<n-1;i++)
  6.     {
  7.           min=i;           //保证从首元素开始逐个比较,这一句很重要!
  8.        for(j=i+1;j< n;j++)//“j=i+1”本元素和下一个元素
  9.        {
  10.               // count1++;
  11.    
  12.      if(k[j]<k[min])//注意!这里如果改成“k[j]>k[min]”就是反序排列了!
  13.      {
  14.            /* 如果下一个元素比前一个元素大,就将二者位置交换,确保k[min]是该数列中的最小值 */
  15.                 /* 通过这一层for循环将最小值与数列中每个元素比较一次,并交换位置确保将该数列中的最小值存放在i指针处 */
  16.               count1++;            //比较次数
  17.              min=j;             //貌似简单,却有技术含量!确保k[min]是该轮循环比较中的最小值
  18.             //换句话说,在该轮循环比较中让每一个元素与最小值k[min]比较,最终实现确保k[min]是该数列中的最小值
  19.      }

  20.     }
  21.     if(min!=i)//如果min不等于i,说明位置发生了交换;并将最小值交换到数序前列;
  22.     {
  23.          temp=k[min];
  24.          k[min]=k[i];
  25.          k[i]=temp; //将最小值存放在数序前列;
  26.           count2++; //计算交换位置次数
  27.    
  28.     }
  29. }
  30.   printf("总共进行了%d次比较,进行了%d次移动" ,count1,count2);
  31. }

  32. int main(void)//比较,输出最大值
  33. {
  34.   
  35. // int m, a[10]={ 0,1,5,4,2,3,6,8 ,7,9};
  36. //  int m, a[10]={ 9,7,0,1,2,3,4,5,6,8 };  //那么排序的效率就大大增加了;
  37.    int m, a[10]={25,10,7,2,34,6,6,8 ,9,0};//那么排序的效率就大大增加了;
  38.     SelectSort( a,10);
  39.    printf("排序后的结果是:\n\r" );
  40.    for(m=0;m<10;m++)
  41.    {
  42.    
  43.       printf("%d\n\r" ,a[m]);
  44.   
  45.    }
  46.    // printf("\n\n" );

  47. return 0; //结束主函数
  48. }
复制代码



/* 本例程学习:选择排序的效率比优化后的冒泡排序效率略高,更易理解   */

-----王衍




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表