C语言【排序算法】在数组的应用

数组的应用方式

排序的目的,在于方便进行查找,针对不同情况,选择对应的排序算法,往往能事半功倍。

逆序

 给定一个数组 (准备10个数据) 对数组进行逆序 
  
       // 0 1 2 3 4 5 6 7 8 9   //下标     
 int a[]={1,2,3,4,5,6,7,8,9,10};//数值 
          //10,9,8,7,6,5,4,3,2,1

  所谓逆序:
  对应位置上值交换一下 

  
  0号位置  9号位置               //下标相加 为 9 // len - 1
  1号位置  8号位置 
  2号位置  7号位置 
  3号位置  6号位置
  4号位置  5号位置
  
  a[i] <=> a[9-i];
  int i; 
  int temp;
  temp = a[i];
  a[i] = a[9-i];
  a[9-i] = temp;

这是整型逆序的方法,如果是字符串逆序 又该如何做呢?

提示:strcpy();

选择排序

思想:给对应的位置选择合适的数

顾名思义,选择排序就是通过遍历数组,从中选择出数组的最小或最大值,同时与指定位置交换数据,遍历完整个数组的所有位置就可以完成排序

for (j = 0; j < n - 1; ++j)                      // 确定位置
    {

                                                              //找最小值,将a[j]当作最小值的位置
        for (i = j + 1; i < n; ++i)              //找到合适的数
        {
            if (a[i] < a[j])
            {
                t = a[i];                                   //交换
                a[i] = a[j];
                a[j] = t;
            }
        }
    }

冒泡排序

思想:相邻两个元素,两两比较,小的放前,大的放后 

 for (j = 0; j < n-1; ++j)                          //遍历数组
    { 
        for (i = 0; i < n - j-1; ++i)               //   比较相邻元素后升序
        {
            if (a[i] > a[i+1])
            {
                t = a[i];                               //交换
                a[i] = a[i+1];
                a[i+1] = t;
            }
        }
    }

插入排序

思想:   将一个数,插入到一个有序的序列中。注意是有序的序列中

难点在于如何找到合适的位置? 

选择一个位置,将插入的位置标记为key,和位置所在后面的数据比较大小,小则降序,大则移动插入的位置

实现步骤:
 1.拿一个要插入的值
 2.寻找最终要插入的位置
 3.找到后插入数据

//原地插入 
    for (i = 1; i < n; ++i)                    //1.控制拿数据 
    {
        int key = a[i];                              //拿数据
        j = i;
        while (j > 0 && a[j-1] > key)       //2.找位置 
        {
            a[j] = a[j-1];
            --j;
        } 

        a[j] = key;                                   //3.插入数据
    }

    
   二分查找

前提:
    查找的数据 一定是有序的。查找的数量只能是一个。

    
思路:
   1.找一个中间位置 mid  (实际是数组中间位置的下标 )
     判断中间位置上的值 与 要查找的值的大小关系 
           a[mid] > n
   2.a[mid] > n 
     缩小区间 ,到前面小的一部分继续 二分查找 
   3.a[mid] < n
     缩小区间, 到后面大的一部分继续 二分查找
   4.a[mid] == n 
     直接表示找到了 

代码
int n;                                    //假设要查找的是n
int begin = 0;
int end = len-1;
int mid;
while(begin<=end)
{
mid = (len-1+begin)/2        //产生一个中间位置的下标
if(a[mid]>n)
{
end = mid-1;
}else if(a[mid]<n)
{
begin = mid +1;
}else
{
break;
}
}
if(begin<=end)
{
printf("found\n");
}else
{
printf("no found\n");
}

上述都是整型数组的排序算法,针对字符串数组来说,思路都是一样的,区别在于字符串能用strcpy,strcmp这两个函数更方便的进行比较和交换。

算法排序在c语言中有着至关重要的作用,万丈高楼平地起,要实现各种复杂的功能,少不了算法排序。网上关于算法排序有很多优秀的讲解,看到有思路不错的,可以私信推荐给笔者,一起交流学习,共同进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值