C语言(7)数组(ii)

排序:

        排序 --- 按照一定顺序排列 
        
    (1).从小到大 --- 升序 
    (2).从大到小 --- 降序 
    
    排序方法:
                    选择排序 
                    冒泡排序 
                    插入排序 
                    快速排序  
     

选择排序:

核心代码:

 for (i = 0; i < n-1; ++i)         //控制位置    
    {
        for (j = i + 1; j < n; ++j) //找数 
        {
            if (a[j] < a[i])
            {
                int t = a[i];
                a[i] = a[j];
                a[j] = t;
             }
          }
    }

思路:

           1.将第一个位置数与后面的数一一比较。//代码第一个位置对应a[i],其中i = 0。

           2.若发现后面某个数比第一个位置的数小,两个数则交换位置。//if中的三个语句

           3.较小的数放在第一个位置后,不从头开始,继续刚才的位置向后比较直到结束

              解释:i的取值范围是[0,n-2],j的取值范围为[i+1,n-1],这是因为在程序中我们

                         是最后将a[n-2]与a[n-1],也就是i取最大值时的a[i]与j取最大值的a[j]比较。

                         当i取到n-2时,a[n-2]就可以与a[n-1]比较,也就是完成了所有数的比较。

           4.当i=0取完时,此时,a[0]中存放的是数组的最小值。然后i取1,重复上述步骤,便 

              可从小到大排列。至于j取最小值取i+1的原因是因为我们只要与i的后面的数比较,

              不要与i前面的数比较。所以j一开始的取值就比i大1。

冒泡排序:    

核心代码:

      for (i = n-1; i > 0; --i)
      {
            for(j = 0; j < i; ++j)
            {
                 if (a[j] > a[j+1])
                 {
                     int t = a[j];
                     a[j] = a[j+1];
                     a[j+1] = t;
                  }

             }
       }

 思路:

        1.从第一个数开始,即a[j],j = 0,若a[j]比后面的一个数a[j+1]大,两个就交换位置,

            否则,j就加1。也就是一开始a[0]与a[1]比较,若a[0]小于a[1],则进行a[1]与a[2]比

             较。

        2.若a[1]>a[2]这将两个数交换位置,再进行a[2]与a[3]的比较。

            注意:此时,a[2]里的值为之前a[1]的值,a[1]的值为之前a[2]的值。

        3.上述操作可将数组中最大的值放进a[n-1]也就是数组最后一个值。

        4.重复上述操作便可将数组从小到大排列又因为我们每次循环i的值都会减一,所以我们

            每次循环就不会操作到后面完成比较的值
     


原地插入排序 :

核心代码:

   for (i = 1; i < n; ++i)
    {
        int t = a[i];
        j = i;

        while(j > 0 && t < a[j-1])
        {
             a[j] = a[j-1];
             --j;
        }
        a[j] = t;
    }        
    

思路:  

            1.将第i个数,a[i]与前面的数一一比较若a[i]>a[j],则记录j的位置并a[j-1]与其后面的数( 不                 包括a[i])全向后移一位,然后将a[i]放到之前a[j]的位置。

            2.因为i是逐渐变大的,所以a[i]前面的数是按照从小到大排好的,之后我们只需要将后面的                 数依次向前面摆,大的数逐渐后移便可以实现将所有数从小到大排列。
    

    查找算法:

  二分查找(折半查找) 

  大前提:
        数据得是有序的(下代码是从小到大)

 核心代码: 

  while(begin <= end)
   
    {
        if(a[mid] > n)
        {
            end = mid - 1;
            mid = (begin + end) / 2;
        }
        else if(a[mid] < n)
        {
            begin = mid + 1;
            mid = (begin + end) / 2;
        }
        else 
        {
            printf("a[%d] = %d",mid,n);
            break;
        }
    }

思路:    

            1.说明:begin初值为0,end初值为n-1,mid初值为(begin + end)/ 2,n为要找的值

            2.在循环里面如果a[mid]也就是中间比要找的值n大,故n应该在a[mid]前面,此时将end变                 为mid -1,再求新的mid,再比较。为什么取mid - 1 而不是mid呢,因为如果数组中没有                 这个值的话最终,mid begin end三个值会想等,就无法退出循环。

            3.如果最后end > begin就意味着数组里面没有对应的值

一维字符型数组: 

  数据类型 数组名[数组长度];
   int       a    [10];
   char      s    [20]; //一维字符型数组 
   

从数组角度:
   char s[20] = {'a','b','c','d'};
  
   数组 用来 存储数据的 
   一维字符型数组 --- 放字符串 
   "hello" //字符串 
  
  //字符串的角度 
  char s[20] = {"hello"};
  
   
   
  "hello"  //数组的特点 
  
  
  1.字符串 是 当做字符数组来处理的。
  2.字符串 有一个专门的结束标志 '\0'
  3.处理的是字符串,操作的时候,往往以 结束标志 为 操作依据 
  4.处理的是数组,操作的时候,往往以 数组长度 作为操作依据 
  5.字符数组可以用来存储字符串 
    而字符串在内存中存储的方式 也是以字符数组形式存储的     
   
  "hello" --- 'h''e''l''l''o''\0'
               实际占用的内存空间,是包含了'\0'   

""  //字符串 --- 空字符串 '\0'
    
     int puts(const char *s);
     功能:
           输出一个字符串 
     参数:
         s   //表示字符串 -- 指针类型 
             //字符数组名 s
             //字符串常量 "hello"
    返回值:
          成功 非负数 
          失败 -1 
    注意:
       puts输出时 自动会加 换行 
       
     
     gets 
     char *gets(char *s);
     功能:
         从键盘获得一个字符串 
     参数:
         s  //代表就是一块存储空间 --- 需要的是一个一维字符型数组的数组名
     返回值:
        成功 s 
        失败 NULL 

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值