2.1 选择排序算法
一个好的迭代器,只需要修改排序算法,其他的程序都无需修改。其实这里只需要把冒泡排序算法修改为选择排序算法即可。
选择排序算法程序如程序清单2. 1所示。
程序清单2. 1 选择排序函数
- /*******************************************************************************
- **函数名称: selectSort
- **函数功能: 选择排序
- **入口参数: *pvData: 需要进行排序的数组
- stAmount: 数组中包含的元素个数
- stSize: 元素内存大小
- CompareFun: 需要排序的数据类型、升序还是降序
- **出口参数:
- *******************************************************************************/
- void selectSort (void *pvData , size_t stAmount, size_t stSize , COMPAREFUN CompareFun)
- {
- int i , j , k ;
- void *pvThis = NULL;
- void *pvThat = NULL;
- /*
- * 冒泡排序
- */
- #if 0
- printf("pvData = %#x\n" ,pvData ) ;
- printf("pvThis = %#x\n" ,pvBegin ) ;
- printf("pvThat = %#x\n" ,pvEnd ) ;
- #endif
- for ( i = 0 ; i < stAmount ; i++ ) {
-
- k = i ;
- for ( j = i + 1 ; j < stAmount ; j++) {
-
- pvThis = (char *)pvData + j*stSize;
- pvThat = (char *)pvData + k*stSize;
- if (CompareFun(pvThis , pvThat ) > 0) {
- k = j ;
- }
-
- if( k != i ) {
- pvThis = (char *)pvData + i*stSize;
- pvThat = (char *)pvData + k*stSize;
- __swap(pvThis , pvThat , stSize);
-
- }
- }
- }
- }
复制代码 其实这个选择排序函数和冒泡排序函数只是改动了内部程序,其他地方都没有修改。道理是一样,我就不加说明。
触类旁通的思想真的很重要,当你庖丁解牛对待一个冒泡排序的时候,你会发现其他排序方法也就自然而然会了。
我们看看测试结果:
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
先测试一些数据,便于我们理解
第一组数据:
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'
请按任意键继续. . .
测试通过!
|