C-冒泡排序,选择排序,数组
——构造类型
->数组
->一维数组
->相同类型的一组数据
->类型修饰符--数组名—[数组的元素个数(必须是整型表达式或者是整型常量,不能是变量)] {初始化}
int arr[3] = {1,2,3}; arr[1] = 5; printf("%d",arr[1]);
->数组内存的值为变量
->使用数组的时候中括号内可以是变量
->sizeof()是一个运算符,不是一个函数,可以计算变量或者变量修饰符占了多少个字节,也可以对数组进行计算占的字节数
int a[3] = {1,2,3}; printf("%ld\n",sizeof(double)); printf("%ld\n",sizeof(char)); printf("%lu",sizeof(a));
->数组所占用的内存空间等于数组元素个数*单个元素所占的内存空间.
->用循环输出数组比较快
short arr[] = {1,2,3}; printf("%ld\n",sizeof(arr)); for (int i = 0; i < 3 ; i ++) { printf("%d\t",arr[i]); }
->数组合并
for (int i = 0; i < 100000000; i++) { int a[20] = {0}, b[20] = {0}, c[20] = {0}; for (int i = 0; i < 20; i ++) { a[i] = arc4random() % 21 + 20; b[i] = arc4random() % 21 + 20; c[i] = a[i] + b[i]; if (c[i] == 80) { printf("\na[%d](%d)+ b[%d](%d)= c[%d](%d)",i,a[i],i,b[i],i,c[i]); } // printf("\na[%d](%d)+ b[%d](%d)= c[%d](%d)",i,a[i],i,b[i],i,c[i]); } }
->循环输入值,赋值给相应的数组下标
//错误问题:
//数组是一个整体不能够参与运算
//只能取每个元素逐一使用
//随机一个具有20 整型数组 找出数组中最大值 int a[20] = {0}; int max = 0; for (int i = 0 ; i < 20; i++) { a[i] = arc4random() % 100; printf("%d\t",a[i]); if (a[i] > max) { max = a[i]; } //max = a[i] > max ? a[i]:max; } printf("\n最大数:%d",max); int a[20] = {0}; int min = arc4random() % 101; for (int i = 0; i < 20 ; i++) { a[i] = arc4random() % 101; if (min > a[i]) { min = a[i]; } printf("%d ",a[i]); } printf("\n最小值:%d",min); int a[5] = {0}; for (int i = 0 ; i < 5 ; i ++) { scanf("%d",&a[i]); } for (int i = 0 ; i < 5 ; i++) { printf("\t%d",a[i]); }
——算法
->数组排序
->冒泡排序
->若有n个元素,则外层循环走n - 1次
->内层循环需要, n - 1 - i 次
1 int arry[5] = {0}; 2 for (int i = 0 ; i < 5; i ++) { 3 arry[i] = arc4random()%21 + 50; 4 printf("%d\t",arry[i]); 5 } 6 printf("\n"); 7 for (int i = 0 ; i < 4 ; i++) { 8 for (int j = 0 ; j < 4 - i; j++) { 9 if (arry[j] > arry[j + 1]) { 10 int temp = arry[j]; 11 arry[j] = arry[j+1]; 12 arry[j+1] = temp; 13 } 14 } 15 } 16 for (int i = 0; i < 5; i++) { 17 printf("%d\t",arry[i]); 18 }
->选择排序
->外层循环控制比较趟数,每趟开始的时候假定开始的位置是最小值
->内层循环,从后面的一个值开始逐一比较,如果比最小值更小,更新,最小值的 位置.
->每趟结束之后如果最小值的位置和假定的最小值位置不一样则交换,一样则不用交换位置.
(也就是每趟比较的是下标,交换的也是下标,保证每趟交换之后,下标是最小的,然后再与最初假定的最小下标相比,如果不相同 则交换值)
1 int arry[20] = {0}; 2 for (int i = 0; i < 20 ; i++) { 3 arry[i] = arc4random() % 100; 4 printf("%d\t",arry[i]); 5 } 6 for (int i = 0 ; i < 19 ; i++) { 7 int minIndex = i; 8 for (int j = i + 1 ; j < 20 ; j++) { 9 if (arry[minIndex] > arry[j]) { 10 minIndex = j; 11 } 12 13 } 14 if (minIndex != i) { 15 int temp = arry[i]; 16 arry[i] = arry[minIndex]; 17 arry[minIndex] = temp; 18 } 19 } 20 printf("\n"); 21 for (int i = 0 ; i < 20; i++) { 22 printf("%d\t",arry[i]); 23 }
—字符数组
->数组里也都是变量
->%s专门输出字符串
->\0 标志字符数组的结束
//计算字符串数组中的空格数 char a[100] = "aslkdj alskf salkjd slkf"; int i = 0,sum = 0; while (a[i] != 0) { if (a[i] == ' ') { sum++; } i++; } printf("%d",sum); char str[100] = ""; //scanf("%s",str ); scanf("%[^\n]",str); // gets(str); printf("%s",str); return 0;
->strlen()(无符号长整型)
输出时并不考虑\0
->strcpy(后边拷到前边)
->最后一个\0会被拷过去
->被考入的字符串数组范围必须大于 要拷的字符串范围,不然会越界,虽然还会执行,但是有风险.
->strcat()
->两个字符串连到一起
->被拼入的字符串内存也要够大,不然会报错
->strcmp()
->逐一比较两个字符串相对应的字符的ASCII码值大小,返回值是整型
->如果两个字符串相应位置的ASCII码的差值不是零,则返回差值,也会是负数
->计算字符数组中空格数
->输入字符串
->scanf遇到空格默认是结束
->输出格式改为:”%[^\n]” 除了空格都要
1 //字符数组 2 //char arry[10] = {'m','a','o','m','a','o','h','h'}; 3 // char arr[10] = {"maomaohehe"}; 4 // printf("%c",arry[7]); 5 // arry[3] = 0; 6 // char arry1[] = "hello";//系统会自动补一个\0 7 //// char arry3[] = {'h' , 'e', 'l', 'l', 'o'}; 8 // char arry2[] = {'h' , 'e', 'l', 'l', 'o'};//这中方法系统不会补\0 如果用printf("%s\n",arry2);输出 系统不会停止,除非遇到\0 9 // printf("%s\n",arry2); 10 11 12 //printf("%s",arry); 13 // 14 // char string[] = "i love iOS!"; 15 // unsigned long length = strlen(string); 16 // printf("%lu",length); 17 18 19 // char string[] = "iloveiOS"; 20 // int i = 0; 21 // while (string[i] != 0) { 22 // i++; 23 // } 24 // printf("%d",i); 25 26 // char arry1[20] = "aaaaaaaa"; 27 // char arry2[10] = "iphone"; 28 //// strcpy(arry1, arry2); 29 //// printf("%s",arry1); 30 //// strcat(arry1, arry2); 31 // 32 // int result = strcmp(arry1, arry2); 33 // //printf("%s",arry1); 34 // printf("%d",result);