嵌入式Linux C编程学习之路(五)——基础排序算法

      在进行排序算法时经常用到交换两个数组元素的功能,将这个功能单独写成一个子函数,采用传引用调用的参数传递方式,对数组元素的地址直接进行操作,达到改变其位置的功能。代码如下:

void swap(int*p,int*q)
{
  int a;
  a=*p;
  *p=*q;
  *q=a;
}

一:选择排序
    将要排序的对象分作两部份,一个是已排序的,一个是未排序的,从后端未排序部份选择一个最小值,并放入前端已排序部份的最后一个。

void slef(int a[])
{ int i,j,k;
  for(i=0;i<9;i++)//选择第i位,将其他位依次与他相比较
        {
          for(j=1+i;j<10;j++)//其他位选择
            {
              if(a[j]<=a[i])//当其他的位存在比第i位小的数时,
                {swap(&a[j],&a[i]);//交换

                }
            }
          printf("第 %d 次排序:", i+1);
           for(k = 0; k < 10; k++)
           printf("%d ", a[k]);
           printf("\n");
        }
}

运行结果如下: 

[root@loc paixu]# ./a.out 
4
第 1 次排序:6 95 90 49 80 58 27 9 18 50 
第 2 次排序:6 9 95 90 80 58 49 27 18 50 
第 3 次排序:6 9 18 95 90 80 58 49 27 50 
第 4 次排序:6 9 18 27 95 90 80 58 49 50 
第 5 次排序:6 9 18 27 49 95 90 80 58 50 
第 6 次排序:6 9 18 27 49 50 95 90 80 58 
第 7 次排序:6 9 18 27 49 50 58 95 90 80 
第 8 次排序:6 9 18 27 49 50 58 80 95 90 
第 9 次排序:6 9 18 27 49 50 58 80 90 95 

二:插入排序
       像是玩朴克一样,我们将牌分作两堆,每次从后面一堆的牌抽出最前端的牌,然后插入前面一堆牌的适当位置。 

void ins(int a[])
{
  int i,j,k,tmp;
  for(j = 1; j < 10; j++)
    {
      tmp = a[j];
  i=j;
  while(tmp<a[i-1])
    {
      swap(&a[i],&a[i-1]);
      i--;
      if(0==i)
        break;
    }

  printf("第 %d 次排序:", j);
  for(k = 0; k < 10; k++)
  printf("%d ", a[k]);
  printf("\n");
  }
}

运行结果如下: 

[root@loc paixu]# ./a.out 
5
第 1 次排序:27 95 90 49 80 58 6 9 18 50 
第 2 次排序:27 90 95 49 80 58 6 9 18 50 
第 3 次排序:27 49 90 95 80 58 6 9 18 50 
第 4 次排序:27 49 80 90 95 58 6 9 18 50 
第 5 次排序:27 49 58 80 90 95 6 9 18 50 
第 6 次排序:6 27 49 58 80 90 95 9 18 50 
第 7 次排序:6 9 27 49 58 80 90 95 18 50 
第 8 次排序:6 9 18 27 49 58 80 90 95 50 
第 9 次排序:6 9 18 27 49 50 58 80 90 95 

三:气泡排序法
       顾名思义,就是排序时,最大的元素会如同气泡一样移至右端,其利用比较相邻元素的方法,将大的元素交换至右端,所以大的元素会不断的往右移动,直到适当的位置为止。

void paos(int a[])
{
  int i,j,k,f=1;
  for(j=0;j<9&&f==1;j++)
    {f=0;
 for(i=0;i<9-j;i++)
   {
     if(a[i]>a[i+1])
       {
       swap(&a[i],&a[i+1]);
       f=1; }
   }
      printf("第 %d 次排序:",j+1);
        for(k = 0; k < 10; k++)
        printf("%d ", a[k]);
        printf("\n");
    }

}

运行结果如下 :

[root@loc paixu]# ./a.out 
6
第 1 次排序:27 90 49 80 58 6 9 18 50 95 
第 2 次排序:27 49 80 58 6 9 18 50 90 95 
第 3 次排序:27 49 58 6 9 18 50 80 90 95 
第 4 次排序:27 49 6 9 18 50 58 80 90 95 
第 5 次排序:27 6 9 18 49 50 58 80 90 95 
第 6 次排序:6 9 18 27 49 50 58 80 90 95 
第 7 次排序:6 9 18 27 49 50 58 80 90 95 

      冒泡排序时,当某次排序不发生数组元素交换时,则排序位完成,这是即可终止排序以减少程序运行时间,代码中通过设置一个标志符f来判断是否产生交换。

附:主函数

int main()
{   int b=0;
    int a[10]={95,27,90,49,80,58,6,9,18,50};
    scanf("%d",&b);
    if(4==b)
      {
        slef(a);
      }
    if(5==b)
      {
        ins(a);
      }
    if(6==b)
      {
        paos(a);

      }
    else

      {
    return 0;
      }
}

猜你喜欢

转载自blog.csdn.net/Alone_k/article/details/81256328