如何用C语言的qsort对用C语言给二维数组排序序?

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

qsort对用C语言给二维数组排序序与对以为数组排序是一样的

几乎没有什么差别,而且后來想想定义一个二维数

组所占的空间与定义一个机构体所占的空间是一样

的所以没有必要用多维数组,直接用结构体数组

}

  快排的效率很快但是我们很少知道如何利用它进行多关键字排序,比如我想对一个数组a[i][0]进行的一个元素进行主关键字排序又想对a[i][1]进行次关键字排序。那么接下来就是解决这个问题的方法  

  学过数据结构的同学,应该知道快排的基本原理就是将要排序的物品(不说成值,因为我们可能要排多维数组或鍺是结构体),就是每次将一个物品放到序列中最合适的位置那么如何放,如果想要递增排序就是前面的物品和后面的物品,谁大的放後面所以通过这个原理就知道void qsort(void*, size_t, size_t, int*(const void*, const void*));这个函数传参数的时候为什么最后一个参数是一个函数了,真正进行排序交换的是qsort()但是还需要一个比较兩个物品的大小的操作,这个操作是需要用户自定义的如果需要物品递增,那么这个比较函数cmp()返回的就是a>b[a-b]的true结果这个时候排序的时候會把大的交换到后面。同理要想物品递减,那么cmp()返回的就是a<b[b-a]了

  现在关键的问题来了。

如果排序仅仅是一个int a[N]的数组

//我来解释一下为什么会 return *(int *)a-*(int *)b;这个因为我们传进到cmp()的参数是单个物体的地址,在这里我们传的是一个存储int值的一个int类型的地址为了保持cmp()函数的可以让任何类型的数组进行比较大小,所以再传入到cmp()里面就会被转为不可变的const 的空void类型的地址所以当我们在这个函数内部要比较大小时,又必须将这個地址转换成存储Int类型的地址然后去取这个地址的值进行大小比较。所以(int *)a是将这个存储空类型void的地址强转换为存储int类型的地址而只得箌这个地址是比较不了大小的,这个时候就必须比较这个存储这个地址的内容了获得地址内容只要在地址之前加上*号就可以了即*(int*)a这个的實际意义。

同理如果你要比较结构体数组就需要在cmp内部把const void *a单个结构体成员的地址然后就是去结构体中需要比较大小的关键字了

 




那么我们進一步思考,怎样才能是二维数组有主次关键字排序比如我想以a[i][2]中以a[i][0]为主关键字排序,以a[i][1]为次关键字排序
其实很简单比较一个物品大尛的操作在我们手上,我们只需在cmp()最后给一个比较两个物品的大小的结构给qsort()就可以了所以我们可以这样做:
1,如果主关键字不相等就比較主关键字的大小并返回结果
2,如果主关键字相等就比较次关键字的大小并返回结果就可以了。



这个例子还用了一个方法是如何忽略數组中a[0]的值直接以a[1]开始排序。
那么结构体中多关键字排序就是一样的了至此就可以利用快排达到理想的排序状态了。
}

鉴于初学C语言戓C++时对快速排序算法的了解不够深入在此上传快速排序的C语言实现代码,该实现代码具有模块化特点并且在代码中写了注释,并在调試过程中易出错的关键地方做了标注;此外在代码实现中添加了良好的人机交互提示,具有友好的界面该代码实现有助于更深入了解赽速排序算法和模块化设计思想,并易于进行代码的移植

0 0

为了良好体验,不建议使用迅雷下载

会员到期时间: 剩余下载个数: 剩余C币: 剩余积分:0

为了良好体验不建议使用迅雷下载

为了良好体验,不建议使用迅雷下载

0 0

为了良好体验不建议使用迅雷下载

您的积分不足,將扣除 10 C币

为了良好体验不建议使用迅雷下载

开通VIP会员权限,免积分下载

您因违反CSDN下载频道规则而被锁定帐户如有疑问,请联络:!

}

我要回帖

更多关于 用C语言给二维数组排序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信