您的位置:首页 > 编程语言 > C语言/C++

C语言排序问题

2014-05-07 09:55 148 查看
先前对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;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息