排序
(1)选择排序
选择排序的基本思想是每次从待排序的数据元素中选择最小(或最大)的一个元素,放到已排序序列的末尾,直到全部待排序的数据元素排完为止。即合适的位置选择合适的数,以升序排列为例,首先我们需要为数组中的第一个位置选择最小的数。实现的过程是用数组的第一位数a[0]依次与数组中剩下的未排序数进行比较,若a[0]的数值大于未排序数,则两者数值进行交换,确保最后a[0]的数值是数组中最小的。(用数组中的 a[i](i = 0、1、2、3...len-1)与剩下未排序的数依次进行,若 a[i] 大于未排序数则进行交换,最终得到升序排列的数组。)
10 for(i = 0;i < len-1;++i) //确定当前要比较的位置
11 {
12 for(j = i+1;j<len;++j)
13 {
14 int temp = a[i];
15 if(a[j] < a[i]) //依次和当前位置后面的数进行比较
16 {
17 a[i] = a[j]; //若当前位置的数大于比较位置数,则进行交换
18 a[j] = temp;
19 }
20 }
21 }
(2)冒泡排序
冒泡排序是一种简单直观的排序算法,它重复地走访过要排序的数列,依次比较相邻的两个元素,将较大的数往后移,每一轮排序完成后,最大的数就沉到了最后的位置。
10 for(i = 1;i<n;++i) //比较的趟数
11 {
12 for(j = 0;j<n-1;++j) //一趟比较的次数
13 {
14 if(a[j] >a[j+1]) //满足条件,比较数进行交换
15 {
16 int temp =a[j];
17 a[j] = a[j+1];
18 a[j+1] = temp;
19 }
20 }
21 }
(3)插入排序
插入排序每次将一个待排序的元素插入到已经排序的序列中的适当位置,直到整个数组排序完成,形成有序的数列。
23 for(i = 1;i < len;++i)
24 {
25 int t = a[i];
26 j = i;
27 while(j > 0 && t < a[j-1])
28 {
29 a[j] = a[j-1];
30 --j;
31 }
32 a[j] = t;
33 }
查找
二分查找
二分查找是一种高效的查找算法,它的基本思想是通过每一次比较,将查找范围减半,从而快速定位目标值。即在有序的数组将数据范围一分为二,利用中间值与要查找的数进行大小比较,不断折半缩小查找范围,最终确认查找数是否在数组中。
注意:二分查找要求数组是有序的,如果数组无序,需要先进行排序。
示例代码:
1 #include<stdio.h>
2
3 int main(void)
4 {
5 int a[] = {1,3,5,6,7,8,10};
6 int len = sizeof(a)/sizeof(a[0]);
7 int begin = 0;
8 int end = len - 1;
9 int mid, num;
10 printf("Input a num:");
11 scanf("%d",&num);
12
13 while(begin <= end)
14 {
15 mid = (begin + end)/2;
16
17 if(a[mid] > num)
18 {
19 end = mid + 1;
20 }else if(a[mid] < num)
21 {
22 begin = mid + 1;
23 }else
24 {
25 break;
26 }
27 }
28
29 if(begin <= end)
30 {
31 printf("yes!\n");
32 }else
33 {
34 printf("no!\n");
35 }
36
37 return 0;
38 }
字符型数组
一维字符型数组: 数据类型 数组名[数组长度];
从数组角度:
char s[20] = {'a','b','c','d'};
字符串的角度:
char s[20] = {"hello"};
1.字符串是当做字符数组来处理的。
2.字符串有一个专门的结束标志 '\0' 。
3.处理的是字符串,操作的时候,往往以结束标志为操作依据。
4.处理的是数组,操作的时候,往往以数组长度作为操作依据。
5.字符数组可以用来存储字符串,而字符串在内存中存储的方式 也是以字符数组形式存储的。
puts:int puts(const char *s);
功能: 输出一个字符串
返回值: 成功 非负数 失败 -1
gets : char *gets(char *s);
功能: 从键盘获得一个字符串
返回值: 成功 s 失败 NULL