C语言排序问题

先前对C语言有一定的的入门知识,但是由于没有深入学习,就一直停留在了这个水平。如今有时间了,重操旧业,开始“吃剩饭”,重新学习C语言 了。听大牛们都说,要真正的学懂某些东西,不是自己看明白了就可以了,最好的学习方法是把自己明白的讲出来,讲给别人,让被人也理解了,这才是真正的掌握了。我也就自己开了博客,来把自己学到的总结,记录下来。。。。。。

正文

相信了解过C语言的都知道,指针是C语言学习中最重点的一部分,同时如果它不是最难的知识点的话,也是最难理解的知识点之一。下面我通过自己对 优先排序和冒泡排序的理解,来说明自己对指针的理解。

先来看看优先排序的示例:
//优先排序算法,在主函数中实现排序 
#include<stdio.h>
int main()
{
	int a[10];
	int n , i , j;
	int index , temp;
	//输入要输入排序的数字个数
	printf("Enter n:");
	scanf("%d" , &n);
	//输入要排序的数,读入到数组a[10]中
	printf("Enter %d numbers:" , n);
	for(i = 0;i < n;i ++)
	{
		scanf("%d" , &a[i]);
	}
	/***********优先排序,从小到大排列**********************************
	 *大循环执行n-1次,小循环每次从大循环加1后开始执行
	 *每次执行一个小循环,将大循环初始的下标换做这一轮最小的数对应的下表
	 */
	for(i = 0;i < (n - 1);i ++)
	{
		index = i;
		for(j = (i + 1) ;j < n;j ++)
		{
			//找出每一轮排序时最小的数对应的下表
			if(a[j] < a[index])
			{
				index = j;
			}
		}
		//交换这一轮比较中的起始数与最小数
		temp = a[index];
		a[index] = a[i];
		a[i] = temp;
	}
	//输出排序后的数组值
	for(i = 0;i < n;i ++)
	{
		printf("%3d" , a[i]);
	}
	printf("\n"); 
	return 0;
}

蓝色标注的为此排序函数的关键部分,我们可以将数组看成是指针常量。
通过含有指针的函数,将这个程序改写为指针的形式后如下。
//优先排序算法
#include<stdio.h>
void priority_sort(int * , int );
int main()
{
	int a[10];
	int n , i;
	//输入要输入排序的数字个数
	printf("Enter n:");
	scanf("%d" , &n);
	//输入要排序的数,读入到数组a[10]中
	printf("Enter %d numbers:" , n);
	for(i = 0;i < n;i ++)
	{
		scanf("%d" , &a[i]);
	}
	
	priority_sort(a , n);

	//输出排序后的数组值
	for(i = 0;i < n;i ++)
	{
		printf("%3d" , a[i]);
	}
	printf("\n"); 
	return 0;
}
void priority_sort(int a[] , int n)
{
	int i , j , index;
	int temp;
	/***********优先排序,从小到大排列**********************************
	 *大循环执行n-1次,小循环每次从大循环加1后开始执行
	 *每次执行一个小循环,将大循环初始的下标换做这一轮最小的数对应的下表
	 */
	for(i = 0;i < (n - 1);i ++)
	{
		index = i;
		for(j = (i + 1) ;j < n;j ++)
		{
			//找出每一轮排序时最小的数对应的下表
			if(a[j] < a[index])
			{
				index = j;
			}
		}
		//交换这一轮比较中的起始数与最小数
		temp = a[index];
		a[index] = a[i];
		a[i] = temp;
	}
}
写到这里,我自己就比较明白了。根据课本上说的,要想实现函数返回多个值,必须要用到指针。那么怎样才能够用指针实现调用的函数返回需要的值呢?其实,直白的说就是在调用函数时,使用该变量的地址,而在函数中,我们就是操作这个地址对应的形参的内容,这样就可以实现主函数变量的值的改变了。

下面是使用指针实现的冒泡排序的程序。
#include<stdio.h>
void maopao_sort(int * , int );
int main()
{
	int a[10];
	int n , i;

	printf("Enter n:");
	scanf("%d" , &n);
	printf("Enter %d numbers:" , n);
	for(i = 0;i < n;i ++)
	{
		scanf("%d" , &a[i]);
	}
	maopao_sort(a , n);

	for(i = 0;i < n;i ++)
	{
		printf("%3d" , a[i]);
	}
	printf("\n"); 
	return 0;
}
void maopao_sort(int *p , int n)
{
	int i , j;
	int t;

	for(i = 1;i < n;i ++)
	{
		for(j = 0;j < (n - i);j ++)
		{
			if((*(p+j)) > (*(p+j+1)))
			{
				t = *(p+j+1);
				*(p+j+1) = *(p+j);
				*(p+j) = t;
			}
		}
	}
}





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值