学习目标:
学习内容:
2.1快速排序算法
2.2const
2.3void *
学习练习:
学习产出:
今天主要学习字符串和指针的内容。
指针的进一步使用,迭代的学习
通过一轮的排序将序列分割成独立的两部分,其中前一部分序列的关键字均比后一部分关键字小。继续对长度较短的序列进行同样的分割,最后到达整体有序。在排序过程中,由于已经分开的两部分的元素不需要进行比较,故减少了比较次数,降低了排序时间。
1)先从右向左找第一个比基准数小的数,小于等于的不算。指针为p
2)再从左向右数找第一个比基准数大的数。指针为q
3)循环终止,交换这两个数。
4)重复上面三步,直至p与q重叠在一起,跳出循环。
5)调用swap函数进行begin和p交换
经过上述过程前一部分的值都小于后一部分,与二分查找类似。接下来通过递归调用的思想再对这两部分分别排序。
6)qSort(begin, p-1);
qSort(p + 1, end);
修饰变量代表该变量不可被修改
修饰指针代表指针指向的对象不可被修改,指针本身可以被修改为其他元素的指针
不能进行指针运算,因为其计算结果的数据类型不确定。
1 #include
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 }