一些数组操作,排序法。

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值