首页 > 软件开发 > c语言 > 正文
6.3.3 其它排序
2015-11-23 13:30:46     我来说两句      
收藏    我要投稿

1. 双向冒泡排序

通常的冒泡是单向的,而这里是双向的,也就是说还要进行反向的工作。 世界杯外围投注网站看起来复杂,仔细理一下就明白了,是一个来回震荡的方式。写这段世界杯外围投注网站的作者认为这样可以在冒泡的基础上减少一些交换。

世界杯外围投注官网import <Foundation/Foundation.h>
void Bubble2Sort(int* pData,int Count)
 {
 int iTemp;
 int left = 1;
 int right =Count -1;
 int t;
 do {
          //正向的部分
         for(int i=right;i>=left;i--)
                     {
                       if(pData[i]<pData[i-1])
                                    {
                                      iTemp = pData[i];
                                      pData[i] = pData[i-1];
                                      pData[i-1] = iTemp;
                                      t = i;
                                    }
                     }
          left = t+1;
          //反向的部分
          for(i=left;i<right+1;i++)
                     {
                       if(pData[i]<pData[i-1])
                                     {
                                       iTemp = pData[i];
                                       pData[i] = pData[i-1];
                                       pData[i-1] = iTemp;
                                       t = i;
                                     }
                     }
          right = t-1;
       }while(left<=right);
 }
测试算法:
int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
     int arr[] == {10,9,8,7,6,5,4};
 Bubble2Sort ( ( (arr, 7);
 for(int i = 0; i < 7; i++)
 {
  NSLog(@"%i",arr[i]);
 }
    [pool drain];
    return 0;
}

2. SHELL排序

这个排序非常复杂,看了程序就知道了。 首先需要一个递减的步长,这里使用的是9、5、3、1(最后的步长必须是1)。 工作原理是首先对相隔9-1个元素的所有内容排序,然后再使用同样的方法对相隔5-1个元素的排序,以次类推。

世界杯外围投注官网import <Foundation/Foundation.h>

void ShellSort(int* pData,int Count)
{
 int step[4];
 step[0] = 9;
 step[1] = 5;
 step[2] = 3;
 step[3] = 1;
 int i,Temp;
 int k,s,w;
 for(int i=0;i<4;i++)
             {
               k = step[i];
               s = -k;
              for(int j=k;j<Count;j++)
                         {
                           iTemp = pData[j];
                           w = j-k;//求上step个元素的下标
                           if(s ==0)
                                       {
                                         s = -k;
                                         s++;
                                         pData[s] = iTemp;
                                       }
                          while((iTemp<pData[w]) && (w>=0) && (w<=Count))
                                       {
                                         pData[w+k] = pData[w];
                                         w = w-k;
                                       }
                          pData[w+k] = iTemp;
                       }
            }
 }
测试算法:
int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
     int data[] = {10,9,8,7,6,5,4,3,2,1,-10,-1};
 ShellSort(data,12);
 for(int i = 0; i < 12; i++)
 {
  NSLog(@"%i",arr[i]);
 }
    [pool drain];
    return 0;
}

程序看起来有些复杂。不过也不是很难,把s==0的块去掉就轻松多了,这里是避免使用0 步长造成程序异常而写的世界杯外围投注网站。这个世界杯外围投注网站我认为很值得一看。这个算法的得名是因为其发明者的名字D.L.SHELL。依照参考资料上的说法:“由于复杂的数学原因避免使用2的幂次步长,它能降低算法效率。”另外算法的复杂度为n的1.2次幂。

点击复制链接 与好友分享!回本站首页
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:6.3.2 高级排序
下一篇:6.4.1 认识递归算法
相关文章
图文推荐
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑--致力于做实用的IT技术学习网站

世界杯外围投注官网