C语言学习日记——指针学习(二)

目录

学习目标:

学习内容:

2.1快速排序算法

2.2const

2.3void *   

学习练习:

学习产出:



学习目标:

今天主要学习字符串和指针的内容。


学习内容:

指针的进一步使用,迭代的学习

2.1快速排序算法

 通过一轮的排序将序列分割成独立的两部分,其中前一部分序列的关键字均比后一部分关键字小。继续对长度较短的序列进行同样的分割,最后到达整体有序。在排序过程中,由于已经分开的两部分的元素不需要进行比较,故减少了比较次数,降低了排序时间。

         1)先从右向左找第一个比基准数小的数,小于等于的不算。指针为p

         2)再从左向右数找第一个比基准数大的数。指针为q

         3)循环终止,交换这两个数。

         4)重复上面三步,直至p与q重叠在一起,跳出循环。

         5)调用swap函数进行begin和p交换

经过上述过程前一部分的值都小于后一部分,与二分查找类似。接下来通过递归调用的思想再对这两部分分别排序。

         6)qSort(begin, p-1);

              qSort(p + 1, end);

2.2const

修饰变量代表该变量不可被修改

修饰指针代表指针指向的对象不可被修改,指针本身可以被修改为其他元素的指针

2.3void *   

不能进行指针运算,因为其计算结果的数据类型不确定。


学习练习:

  1 #include<stdio.h>
  2 
  3 void printfArray(int *a,int len)
  4 {
  5     int i;
  6     for( i = 0; i < len;++i)
  7     {
  8         printf("%3d",*(a + i));
  9     }
 10     printf("\n");
 11 }
 12 
 13 void swap(int *a,int *b)//元素交换
 14 {
 15     int temp = *a;
 16     *a = *b;
 17     *b = temp;
 18 }
 19 
 20 void rover(int *begin ,int *end)//逆序输出
 21 {
 22     if(begin >= end)
 23     {
 24         return ;
 25     }
 26     else
 27     {
 28         swap(begin,end);
 29         rover(++begin,--end);
 30     }
 31 //  while(begin < end)
 32 //  {
 33 //      swap(begin,end);
 34 //      ++begin;
 35 //      --end;
 36 //  }
 37 }
 38 
 39 void choiceSort(int *begin ,int *end)//选择排序
 40 {
 41     int *p;
 42     for(; begin < end;++begin)
 43     {
 44         for(p = begin + 1 ;p <= end;++p)
 45         {
 46             if(*begin > *p)
 47             {
 48                 swap(begin , p);
 49             }
 50         }
 51     }
 52 }
 53 void bubbleSort(int *begin ,int *end)//冒泡排序
 54 {
 55     int *p;
 56     for(;end >= begin;--end)
 57     {
 58         for(p = begin ;p < end;++p)
 59         {
 60             if(*p > *(p + 1))
 61             {
 62                 swap(p + 1 , p);
 63             }
 64         }
 65     }
 66 }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
 67 void cahruSort(int *begin,int *end)//插入排序
 68 {
 69     int *i = begin + 1;
 70     for ( ;i <= end;++i)
 71     {
 72         int *p = i - 1;
 73         int temp = *i;
 74         while(p >= begin && *(p) > temp)
 75         {
 76             *(p + 1) = *(p);
 77             --p;
 78         }
 79         *(p + 1) = temp;
 80     }
 81 }
 82 int *erfen(int *begin,int *end,int n)//二分查找
 83 {
 84     int *mid ;
 85     while( begin <= end)
 86     {
 87         mid = (end - begin) / 2 + begin;
 88         if(*mid > n)
 89         {
 90             end = mid - 1;
 91         }
 92         else if(*mid < n)
 93         {
 94             begin = mid + 1;
 95         }
 96         else
 97             return mid;
 98     }
 99     return NULL;
100 }
101 void or(int *a)
102 {
103     if(a)
104     {
105         printf("Find %d\n",*a);
106     }
107     else
108     {
109         printf("NO Find\n");
110     }
111  }
112 
113 void Myputs(char *s)
114 {
115     while(*s)
116     {
117         putchar(*s++);
118     }
119     putchar('\n');
120 }
121 
122 int Mysumputs(char *s)
123 {
124     if(*s)
125     {
126         return Mysumputs(++s) + 1;
127     }
128     else
129     {
130         return 0;
131     }
132 //  while(*s)
133 //  {
134 //      ++count;
135 //      ++s;
136 //  }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 


学习产出:

指针选择排序

 39 void choiceSort(int *begin ,int *end)
 40 {                                                                                                                                                                                
 41     int *p;
 42     for(; begin < end;++begin)
 43     {
 44         for(p = begin + 1 ;p <= end;++p)
 45         {
 46             if(*begin > *p)
 47             {
 48                 swap(begin , p);
 49             }
 50         }
 51     }
 52 }

指针冒泡排序

 53 void buluSort(int *begin ,int *end)
 54 {
 55     int *p;
 56     for(;end >= begin;--end)
 57     {
 58         for(p = begin ;p < end;++p)
 59         {
 60             if(*p > *(p + 1))
 61             {
 62                 swap(p + 1 , p);
 63             }
 64         }
 65     }
 66 }

指针选择排序

 67 void cahruSort(int *begin,int *end)
 68 {
 69     int *i = begin + 1;
 70     for ( ;i <= end;++i)
 71     {
 72         int *p = i - 1;
 73         int temp = *i;
 74         while(p >= begin && *(p) > temp)
 75         {
 76             *(p + 1) = *(p);
 77             --p;
 78         }
 79         *(p + 1) = temp;
 80     }                                                                                                                                                                            
 81 }

函数递归实现二分查找

 82 int *erfen(int *begin,int *end,int n)
 83 {
 84     int *mid = (end - begin) / 2 + begin;
 85     if(begin <= end)
 86     {
 87         if(*mid > n)
 88         {
 89             erfen(begin,mid - 1,n);
 90         }
 91         else if(*mid < n)
 92         {
 93             erfen(mid + 1,end,n);
 94         }
 95         else
 96             return mid;
 97     }
 98     else
 99         return NULL;

查找子串

215 int strFind(const char *s,const char *sub)
216 {
217     int i = 0;
218     for(i = 0;i <= Mysumputs(sub) - Mysumputs(s); ++i)
219     {
220         if(Mystrncmp(sub + i,s,Mysumputs(s)) == 0)
221         {       
222             return i;
223         }
224     }
225     return -1;
226 }

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值