云计算百科
云计算领域专业知识百科平台

玳瑁的嵌入式日记D7-0729(C语言)

排序

   排序 — 将数据按照 从大到小(降序) 或者 从小到大(升序) 排列

C语言中:
    选择排序 
    冒泡排序
    插入排序 

    //快速排序 
  
    统一规定: 升序 
掌握的标准:
   

   
一.选择排序

   思想
      给合适的位置选择合适的数 

     for(i =0;i< n-1;++i)
     {                                                   //初始从0开始和后面对比,最后一位不需要交换
         for(j =i+1;j<n;++j)
         {                                                  //依次拿后面的数来和第一位对比
             if(a[j]<a[i])
             {               
                c=a[i]; 
                 a[i] =a[j];
                 a[j]=c;                               //如果后面的值更小,就交换
             }
         }                           //循环过这个,就会确定i值的最小值。然后退出此循环,i++
     }
 

   二.冒泡排序

   思想
      相邻两个元素,两两比较 
      小的放前,大的放后 
       for(i=1;i<n;++i)
   {                                    //循环的趟数,n-1趟
       for(j=0;j<n-i;++j)
       {                                  //对每个数字进行比较
            if(a[j]>a[j+1] )     //与后面一位比较,如果后面的值更小,就交换,实现大数字的后移
            {
             c=a[j];
             a[j]=a[j+1];
             a[j+1]=c;
            }
       }                    //此循环结束,最后一位数字即为最大的数
    }                     //n-1此循环完后,第一值肯定为最小值,所以不需循环

三.插入排序

 //空间 
   插入排序:
   基本思想 
      找到合适的位置 进行插入 

原地插入

    int key;
     for(i=1;i<n;i++)
    {                                     //从第二位数开始(第一位不用调整,直接给入)
        key=a[i];                   //      暂存为key
        j=i-1;                            //j=i-1即为输入的数字的前一位的位置,a[j]为前一位,而a[j+]即a[i]才为目的位置
        while(j>=0&&a[j]>key)       //倘若j>=0,即前面还有数字,并且前一位数字大于输入数字
        {                                       //  则将前一位的位置空出来,前一位数的数字后移一位
             a[j+1]=a[j];                 //j+1即为后一位
            j–;                          //位置再次前移
         }                                //此循环结束时,将会给输入数字找到适合的位置,即前面的都比输入数字小,而后面的都更大
        a[j+1]=key;                 //此时即可赋值,完成输入数字的插入
    }

非原地插入

    int b[n];
    for(i= 0;i<n;++i)
    {
         j=i;
         while(j> 0 && a[i] < b[j-1])
          {
            b[j] = b[j-1];
            –j;
         }
        b[j] = a[i];
    }
 

 四.排序算法性能 

   时间 
 
    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;
            }
        }
    }
    
    i = 0    n-1
    i = 1    n-2
    i = 2    n-3
    ……   
    i = n-2  1
    
    1 2 3 … n-1
    
    n(n-1)/2
    
    n^2/2 – n/2
    

    O(n^2) //大O记法 
    

    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;
            }
        }
    }
    
    i = n-1   n-1
    i = n-2   n-2 
    i = n-3   n-3
    …
    i = 1     1
    
    1 2 3 4 … n-1

五.数组

1. 透视一维数组:

 数据类型 
 int a[10];               //整型的一维数组 
                             //数组也是一种数据类型 
 

2. 数组的类型 

方法:
 去掉标识符 剩下就是对应的数据雷系 
 int  [10]     //数组类型 — 表示这是一个数组 —是一个能够存放10个int型数据的数组 
 int  [20] 

 int[10]  a; //理解的角度 这样没问题 —c语法不支持写成这样 

 3.数组名

  数组名 
  printf ("sizeof(a) = %ld \\n", sizeof(a)); //
  1.数组名     –代表数组          //从数据类型的角度看 –数组名 —代表数组这种类型  
  2.数组名     –代表数组首元素的地址 //从值的角度看 — 数组名 代表数组首元素的地址 
  3.数组名代表数组首元素的地址 参与到运算中 ,用的其实是这个值 
   数组名 是个常量 
 
 //可变长数组 
   int a[n]; //c99 标准后,数组长度可以是个变量

   
   注意:
    int a[n]; //要求: 不能初始化 
    

六·.查找

   查找的算法 
                                 二分查找 
   
   eg:
     1 ~ 10 
               V
     1 2 3 4 5 6 7 8 9 10 
               
   前提:
     数据,必须是有序的  

 

    

七.字符型一维数组

字符型一维数组  —- 处理 字符串 数据的 

int a[10]; 
char s[10];           //字符这种数据  

主要用途—用来存放字符串数据 
"hello" //字符串常量  
 
"hello" //整体的含义    — 字符串 — 一串字符 

字符串 是一种特殊的字符型一维数组 

 char s[10] = {'h','e','l','l','o'};  
 char s[10] = {'h','e','l','l','o','\\0'};  
   

 数组特点:

 1.连续性 
 2.单一性 
 3.有序性 
 
 字符串 特殊在 —它始终有一个 结束标志      '\\0'
 "hello"  —内存中示意–>                        'h','e','l','l','o','\\0'
 char s[10] = "hello";

puts(); 

 int puts(const char *s);
 功能:
                       输出一个字符串 
 参数:
  @s   — 需要的是一个字符串的首地址 
                           //传 字符型数组的数组名 即可 
                             // "hello" 
返回值:
  成功  非负数 
  失败  -1 
  
  输出效果默认 带有 换行 

 gets

   char *gets(char *s);
   功能:
       从键盘标准输入获得字符串 
   参数:
     @s  表示存放字符串数据的一块空间的起始地址 
   返回值:
     成功 s
     失败 NULL 
     
  注意:
     gets            很容易导致数组越界 带来 栈奔溃 
     scanf            也可以输入字符串 ,但是不能输入带 空格字符串 
     scanf            也会导致数组越界 带来 栈奔溃 

八.练习

   1.输入一个字符串      计算字符串的长度 
     int a[10]; //数组长度 — 10
     字符串长度  
     "hello" // 'h''e''l''l''o''\\0'
    

   2.输入一个字符串,     实现字符串的逆序 
     char s[10] = "hello";

     "hello"
     "olleh"

    

赞(0)
未经允许不得转载:网硕互联帮助中心 » 玳瑁的嵌入式日记D7-0729(C语言)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!