LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 737|回复: 3

shell排序有问题阿 !

[复制链接]
发表于 2005-3-18 14:10:54 | 显示全部楼层 |阅读模式

  1. #include <stdio.h>

  2. int iList[10]={30,80,68,43,70,90,45,51,25,100};
  3. int iSize = 10;
  4. int iGap=iSize/2;
  5. int iTemp;
  6. int iSwap;
  7. int
  8. main(void)
  9. {   
  10.     while( iGap > 0)
  11.     {
  12.                 for (int iSub = 0; iSub < iSize-iGap; iSub++)
  13.                 {
  14.                       if (iList[iSub] > iList[iSub+iGap])
  15.                       {
  16.                            iTemp = iList[iSub];
  17.                            iList[iSub] = iList[iSub+iGap];
  18.                            iList[iSub+iGap] = iTemp;
  19.    
  20.                       }
  21.                }
  22.           iGap=iGap/2;
  23.           printf("iGap is %d\n", iGap);
  24.         
  25.     }
  26.     printf("list1 is %d\n", iList[1]);   
  27.     for (int i = 0; i < 10; i++)
  28.     printf("new list is :%d\n", iList[i]);
  29.     getchar();
  30. }
复制代码

我写的一个shell排序,怎么出来的结果不对啊,不全是从小到大的,中间有几个数字错了!还是我写错了?
发表于 2005-3-18 15:53:48 | 显示全部楼层
Shell排序这种经典算法不可能有错。如果你结果不对是对程序写错了。
回复 支持 反对

使用道具 举报

发表于 2005-3-18 16:08:48 | 显示全部楼层

  1. #include <stdio.h>

  2. int iList[10]={30,80,68,43,70,90,45,51,25,100};
  3. int iSize = 10;
  4. int iGap=iSize/2;
  5. int iTemp;
  6. int iSwap;

  7. void shellSort(int numbers[], int array_size)
  8. {
  9.   int i, j, increment, temp;

  10.   increment = array_size / 2;
  11.   while (increment > 0)
  12.   {
  13.     for (i=0; i < array_size; i++)
  14.     {
  15.       j = i;
  16.       temp = numbers[i];
  17.       while ((j >= increment) && (numbers[j-increment] > temp))
  18.       {
  19.         numbers[j] = numbers[j - increment];
  20.         j = j - increment;
  21.       }
  22.       numbers[j] = temp;
  23.     }
  24.     if (increment/2 != 0)
  25.       increment = increment/2;
  26.     else if (increment == 1)
  27.       increment = 0;
  28.     else
  29.       increment = 1;
  30.   }
  31. }

  32. int
  33. main(void)
  34. {   
  35.     shellSort( iList, iSize );
  36.     for (int i = 0; i < 10; i++)
  37.     printf("new list is :%d\n", iList[i]);
  38.     getchar();
  39. }
复制代码

这个一定对。
回复 支持 反对

使用道具 举报

发表于 2005-3-18 16:14:10 | 显示全部楼层
你的排序中少了最里面小数组的排序, shell的算法
给定数组a[n]

for (gap = n/2; gap > 0; gap /=2)
    for(int i = 0; i < gap; i++)
        Sort 子队列a, a[i + gap], a[i + 2 * gap] ...;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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