Chinaunix首页 | 论坛 | 博客
  • 博客访问: 359228
  • 博文数量: 60
  • 博客积分: 15
  • 博客等级: 民兵
  • 技术积分: 1138
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-20 16:18
个人简介

最多140个字

文章分类

全部博文(60)

文章存档

2016年(1)

2015年(34)

2014年(25)

分类: C/C++

2014-06-08 13:39:37

1,关于网上对于qsort函数对一维数组,二维数组(即字符串,形如char ch[2][6];strcpy(ch[0],"Hello");strcpy(ch[1],"World"); 对”Hello"和"World"排序。)的排序的介绍比较常见,本文介绍了使用qsort函数对动态二维数组(即对字符串进行排序。形如:char**p=new char*[2]; p[0]=new char[6];strcpy(p[0],"Hello");p[1]=new char[6];strcpy(p[1],"World"); 对”Hello"和"World"排序。)进行排序(关于二维数组和动态二维数组内存布局的不同,见http://blog.chinaunix.net/uid-26807100-id-4222404.html)。

点击(此处)折叠或打开

  1. /*
  2. void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
  3. 功 能:使用快速排序例程进行排序
  4. 参数:1 待排序数组首地址;2 数组中待排序元素数量;3 各元素的占用空间大小;4 指向函数的指针,用于确定排序的顺序

  5. qsort 的函数原型:
  6. void __cdecl qsort (void *base,size_tnum,size_t width,int (__cdecl *comp)(const void *,const void*))
  7. 其中base是排序的一个集合数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数,其中comp函数的参数为指向base数组元素地址的指针

  8. 比如:
  9. 对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
  10. qsort(a,1000,sizeof(int),comp);
  11. 其中comp函数应写为:
  12. intcomp(constvoid*a,constvoid*b)
  13. {
  14. return*(int*)a-*(int*)b;
  15. }
  16. 上面是由小到大排序,return *(int *)b - *(int *)a; 为由大到小排序
  17. */

  18. #include<iostream>
  19. #include<cstring>
  20. #include<algorithm>
  21. using namespace std;
  22.  
  23. int pstrcmp(const void *p1, const void *p2)
  24.  {
  25.     //对于该程序,此处我们要获得的是str[0],str[1],str[2]的值,而此时p1和p2的值为指向str[0],str[1],str[2]的地址。
  26.     //只要是指针变量,则在32位操作系统下占用4个字节内存,在64位操作系统下占用8个字节内存,而我们这里需要获得的是字符串的地址(即:
  27.     //str[0],str[1],str[2]的值,在32位操作系统下我们要获得4个字节,在64位操作系统下获得8个字节)。

  1.     // return strcmp((char*)(*(int*)(p1)), (char*)(*(int*)(p2)));//仅适用于32位操作系统,因为不管是在32还是64位操作系统下,
  2.     //int都占用4个字节,而我们需要的是字符串的地址(仅32位操作系统下字符串的地址为4个字节),所以这条语句仅适用于32位操作系统。

  3.      return strcmp((char*)(*(int**)(p1)), (char*)(*(int**)(p2)));//适用于32和64位操作系统,解释同上,略。

  4.     //return strcmp(((char**)p1)[0],((char**)p2[0]));//适用于32和64位操作系统,解释同上,略。

  5.     //return strcmp(*(char**)p1,*(char**)p2);//适用于32和64位操作系统,解释同上,略。

  6.     //关于动态二维数组的内存布局见:图一
  7.  }

  8. int main()
  9. {

  10.    char **str=new char*[3];
  11.    str[0]=new char[8];
  12.    strcpy(str[0],"3101010");

  13.     str[1]=new char[8];
  14.     strcpy(str[1],"1234567");

  15.     str[2]=new char[8];
  16.     strcpy(str[2],"4873279");

  17.     qsort(str,3,sizeof(str[0]),pstrcmp);

  18.     cout<<str[0]<<endl;
  19.     cout<<str[1]<<endl;
  20.     cout<<str[2]<<endl;

  21.     delete[] str[0];//内存释放。
  22.     delete[] str[1];
  23.     delete[] str[2];
  24.     delete[] str;

  25.     return 0;    
  26. }

2,该动态二维数组的内存布局(32位操作系统下):

                                                     图一

        3,排序结果(从小到大排序):

                           图二

阅读(10033) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~