查看: 3553|回复: 1
打印 上一主题 下一主题

选择排序

[复制链接]
跳转到指定楼层
沙发
发表于 2014-8-5 15:27:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2.1 选择排序算法
一个好的迭代器,只需要修改排序算法,其他的程序都无需修改。其实这里只需要把冒泡排序算法修改为选择排序算法即可。
选择排序算法程序如程序清单2. 1所示。
程序清单2. 1  选择排序函数
  1. /*******************************************************************************
  2. **函数名称:  selectSort
  3. **函数功能:  选择排序
  4. **入口参数:  *pvData:    需要进行排序的数组
  5.               stAmount:   数组中包含的元素个数
  6.               stSize:     元素内存大小
  7.               CompareFun: 需要排序的数据类型、升序还是降序
  8. **出口参数:  
  9. *******************************************************************************/
  10. void selectSort (void *pvData , size_t stAmount, size_t stSize , COMPAREFUN CompareFun)
  11. {
  12. int i , j  , k  ;
  13. void *pvThis  = NULL;
  14.     void *pvThat    = NULL;
  15. /*
  16.   *  冒泡排序
  17.   */

  18. #if 0
  19. printf("pvData  = %#x\n" ,pvData ) ;
  20. printf("pvThis  = %#x\n" ,pvBegin ) ;
  21. printf("pvThat  = %#x\n" ,pvEnd ) ;
  22. #endif
  23. for ( i = 0 ; i < stAmount  ; i++ ) {
  24.   
  25.   k = i ;
  26.   for ( j = i + 1  ; j < stAmount ; j++) {
  27.          
  28.    pvThis  = (char *)pvData + j*stSize;         
  29.               pvThat  = (char *)pvData + k*stSize;
  30.    if (CompareFun(pvThis  , pvThat  ) > 0) {
  31.     k = j ;
  32.    }
  33.    
  34.    if( k != i ) {
  35.     pvThis  = (char *)pvData + i*stSize;         
  36.                   pvThat  = (char *)pvData + k*stSize;
  37.     __swap(pvThis  , pvThat  , stSize);
  38.    
  39.    }
  40.   }
  41. }
  42. }
复制代码
其实这个选择排序函数和冒泡排序函数只是改动了内部程序,其他地方都没有修改。道理是一样,我就不加说明。
触类旁通的思想真的很重要,当你庖丁解牛对待一个冒泡排序的时候,你会发现其他排序方法也就自然而然会了。
我们看看测试结果:
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
先测试一些数据,便于我们理解
第一组数据:
sizeof(iArray) = 36
sizeof(iArray[0]) = 4
&iArray = 0x402000
&iArray[0] = 0x402000
(char*)&iArray[0] + sizeof(iArray[0]) = 0x402004
&iArray[1] = 0x402004
&iArray[8] = 0x402020
第二组数据:
sizeof(strArray) = 20
sizeof(strArray[0]) = 4
strArray = 0x402024
&strArray = 0x402024
&strArray[0] = 0x402024
(char*)&strArray[0] + sizeof(strArray[0]) = 0x402028
&strArray[1] = 0x402028
strArray[0] = 0x403000
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
整型数组数据排序之前:
39 33 18 64 73 30 49 51 81
字符串数组排序之前:
'forARM' 'mzdzkj' 'c language' 'shenzhen' 'china'
整型数组数据升序之后:
18 30 33 39 49 51 64 73 81
整型数组数据降序之后:
81 73 64 51 49 39 33 30 18
字符串数组数据升序之后:
'c language' 'china' 'forARM' 'mzdzkj' 'shenzhen'
字符串数组数据降序之后:
'shenzhen' 'mzdzkj' 'forARM' 'china' 'c language'
请按任意键继续. . .
测试通过!

回复

使用道具 举报

板凳
发表于 2014-8-5 15:38:30 | 只看该作者
{:soso_e179:}。。。。不错不错
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表