C语言排序
数组传参的基础,数组名即首地址,数组元素在内存中是连续的,即元素的地址关系是连续的
每个元素地址间相差一个数据类型的字节,对了,还有数组只能存储数据类型相同的元素。这才使
两元素之间的差距相同有规律。数组虽然是顺序数据但是可以通过下标随机访问。
冒泡排序1 选择排序2 还有一个3(好吧,是我说不出名字,尴尬)
下面是直接敲的,如果敲错了,会及时纠正。
#include <stdio.h>
#include <stdlib.h>
void arraySCAN(int arr[],int len); //数组动态初始化
void arrayPRIN(int *arr,int len); //数组元素输出
void arraySWAP1(int *arr,int len); //冒泡排序
void arraySWAP2(int arr[],int len); //选择排序
void arraySWAP3(int *arr,int len); //不知道什么鬼排序
int main(void)
{
int arr_len=7;
//普通数组定义 int array[10];下面指针定义
int *array=NULL;
array=(int *)malloc(sizeof(int)*arr_len);
arraySCAN(array,arr_len);//传数组首地址 和 元素个数 ,防止在功能程序中数组遍历越界
arrayPRIN(array,arr_len);
arraySWAP1(&array[0],arr_len);//array数组名相当于首地址==&array[0];
arrayPRIN(array,arr_len);
arraySWAP2(array,arr_len);
arrayPRIN(array,arr_len);
arraySWAP3(array,arr_len);
arrayPRIN(array,arr_len);
free(array);//因为用了malloc 所有要free 有借有还,再借不难。
return 0;
}
void arraySCAN(int *arr,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("input array[%d] data:",i+1);
scanf("%d",&arr[i]);
}
}
void arrayPRIN(int *arr,int len)
{
while(len--)
{
printf("%d ",*arr++);
}
putchar('\n');
}
void arraySWAP1(int *arr,int len)
{
int i, j;
int temp;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-i-1;j++)
{
if(arr[j]<arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
void arraySWAP2(int arr[],int len)
{
int i, j;
int temp;
int mx;
for(i=0;i<len-1;i++)
{
mx=0;
for(j=0;j<len-i;j++)
{
if(arr[mx]<arr[j])mx=j;//找出每轮循环的最值元素所处的下标
}
temp=arr[mx];
arr[mx]=arr[len-i-1];
arr[len-i-1]=temp;
}
}
void arraySWAP3(int *arr,int len)
{
int i, j;
int temp;
for(i=0;i<len;i++)
{
for(j=i+1;j<len;j++)
{
if(arr[i]<arr[j])//三个排序函数都可以改动此处的判断条件来实现升序或降序
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
这里要提一句,字符数组也可以按这种思维排序,比如信息管理系统中个人信息按名字第一个字母排序。字符的本质也是整型,比如字符的acsii值。
二维数组的小操作
二维数组行列转换,下标分解排序,两个二维数组相乘。下面我直接整中文了呀!
#include <stdio.h>
#define hang 3
#define lie 3
#define len (hang*lie)
void arraySCAN(int arr[][lie]);//数组初始化
void arrayPRIN(int (*arr)[lie]);//数组输出
void hanglieSWAP(int (*arr)[lie]);//行列转换
void arraySWAP(int (*arr)[lie]);//数组排序
//这里的形参是二维数组,形参的最低维内存大小(lie)不能省略。
//别问为啥,问就是编译器不允许。这也是为啥用了宏定义的原因
int main(void)
{
int array[hang][lie]={0};
arraySCAN(array);
arrayPRIN(array);
hanglieSWAP(array);
arraySWAP(array);
arrayPRIN(array);
return 0;
}
void arraySCAN(int arr[][lie])//一个最实诚的操作就是:数组有N维就嵌套N层循环
{
int i, j;
for(i=0;i<hang;i++)
{
for(j=0;j<lie;j++)
{
printf("please input array[%d][%d] data:",i,j);
scanf("%d",&(arr[i][j]));
}
}
}
void arrayPRIN(int (*arr)[lie])
{
int i, j;
for(i=0;i<hang;i++)
{
for(j=0;j<lie;j++)
{
printf("%d ",arr[i][j]);
}
putchar('\n');
}
putchar('\n');
}
void hanglieSWAP(int (*arr)[lie])
{
int arr2[lie][hang];
int i, j;
for(i=0;i<hang;i++)
{
for(j=0;j<lie;j++)
{
arr2[j][i]=arr[i][j];
}
}
for(i=0;i<lie;i++)
{
for(j=0;j<hang;j++)
{
printf("%d ",arr2[i][j]);
}
putchar('\n');
}
putchar('\n');
}
void arraySWAP(int (*arr)[lie])
{
int i, j;
int x,y;
int a,b;
int temp;
for(i=0;i<len;i++)
{
for(j=0;j<len;j++)
{
x=i/lie;
y=i%lie;
a=j/lie;
b=j%lie;
if(arr[x][y]<arr[a][b])
{
temp=arr[x][y];
arr[x][y]=arr[a][b];
arr[a][b]=temp;
}
}
}
}
二维数组相乘
#include <stdio.h>
#define N 3
#define M 4
#define L 2
int main()
{
int a[N][M]={1,2,3,4,5,6,1,2,3,4,5,6};//N行M列 乘 M行L列 = N行L列//条件为第一个二维数组的列等于第二个数组的行
int b[M][L]={1,4,2,5,3,6,7,8};
int c[N][L]={0};
int i=0, j=0, k=0;
for(i=0;i<N;i++)
{
for(j=0;j<L;j++)
{
for(k=0;k<M;k++)
{
c[i][j]+=a[i][k]*b[k][j];
}
}
}
for(i=0;i<N;i++)
{
for(j=0;j<L;j++)
{
printf("%d ",c[i][j]);
}
printf("\n");
}
return 0;
}
字符数组
动态输入输出
#include <stdio.h>
int main(void)
{
char name[3][20];
char arr[5][30]={"bob","jack","hunter","neece","kan"};
int i=5;
while(i--)
{
printf("%s\n",arr[i]);
}
for(i=0;i<3;i++)
{
gets(name[i]);
}
for(i=0;i<3;i++)
{
puts(name[i]);
}
return 0;
}
字符数组的排序也一样,整型数组的排序。
二级指针引用二维字符组
#include <stdio.h>
int main(void)
{
char *seasons[]={"Winter","Spring","Summer","Fall"};
char **p;
int i;
for(i=0;i<4;i++)
{
p=seasons + i;
printf("%s\n",*p);
}
return 0;
}