无聊时总结总结算法之02排序(希尔 完结)

来源:互联网 发布:社会主义中级阶段 知乎 编辑:程序博客网 时间:2024/05/22 06:13
//two way 经过思考后 one way 中第一次原因后 因为// /////////////////////////////错的?????? 我晕了??// /////////////////////////////(问题在于两两相比较不完全,如例子的第二次gap = 5 / 2 = 2// //////////////////////////////排序后//                                  13   27   49   55   4    49   38   65   97   26//                                  1A         1B       1C        1D         1E//                                  2A         2B       2C        2D         2E)//  ////////////////////////////1A 1B 比较,1B 1C 比较 但是1A和1C却没有比较!!!!//  /////////////////////////////请诸位自己调试一下!!!!!!!!!!!!!!这很重要!!!!/*        for(int i=0; i<gap; i++)        {            //因为要有很多组            for(int j=gap+i;j<len;j += gap)            {                if(a[j]<a[j-gap])                {                    int temp =a[j];                    a[j] = a[j-gap];                    a[j-gap] = temp;                }            }        }*/// ////////////////////////////解决方法:对1A 1B 1C 1D 1E进行   直接插入排序!!! 所以:void ShellSort(int* a,int len){    int gap;//zu    for(gap=len/2;gap>0;gap /=2)    {        for(int i=0; i<gap; i++)//gap个组        {            //因为组有很多元素            for(int j=gap+i;j<len;j += gap)            {                if(a[j]<a[j-gap])                {// //////直接插入排序                    int temp =a[j];//复制哨兵                    int k = j-gap; //k 和 i 的意义不一样                   for( ;k>=0&&a[k]>temp;k -=gap)                   {                       a[k + gap] = a[k]; //后移                   }                    a[k+gap] = temp;//插入哨兵 元素                }            }        }     }}
  1. 同理将其简单化:
void ShellSort2(int* a, int n){    int j, gap;    for (gap = n / 2; gap > 0; gap /= 2)        for (j = gap; j < n; j++)//从数组第gap个元素开始            if (a[j] < a[j - gap])//每个元素与自己组内的数据进行直接插入排序            {                int temp = a[j];                int k = j - gap;                while (k >= 0 && a[k] > temp)                {                    a[k + gap] = a[k];                    k -= gap;                }                a[k + gap] = temp;            }}
1 0
原创粉丝点击