惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
T
The Exploit Database - CXSecurity.com
Help Net Security
Help Net Security
腾讯CDC
Project Zero
Project Zero
C
CXSECURITY Database RSS Feed - CXSecurity.com
IT之家
IT之家
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
L
LINUX DO - 最新话题
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Threatpost
N
News | PayPal Newsroom
C
Cybersecurity and Infrastructure Security Agency CISA
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
SegmentFault 最新的问题
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Proofpoint News Feed
A
Arctic Wolf
B
Blog RSS Feed
Forbes - Security
Forbes - Security
P
Privacy & Cybersecurity Law Blog
Attack and Defense Labs
Attack and Defense Labs
V2EX - 技术
V2EX - 技术
P
Proofpoint News Feed
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
阮一峰的网络日志
阮一峰的网络日志
aimingoo的专栏
aimingoo的专栏
T
Tenable Blog
MyScale Blog
MyScale Blog
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
W
WeLiveSecurity
D
DataBreaches.Net
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
罗磊的独立博客
The Last Watchdog
The Last Watchdog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
Vulnerabilities – Threatpost
美团技术团队
Microsoft Security Blog
Microsoft Security Blog

博客园 - LeeXiaoLiang

自己写的一个javascript下拉列表类 jquery1.5.1根据元素ID获取元素对象 jquery向.ashx文件post中文乱码问题的解决 【转】通过在RowDataBound事件中把行索引绑定到控件的CommandArgument,然后在RowCommand事件中取出 - LeeXiaoLiang - 博客园 【转】GridView的RowCommand事件中取得行索引 - LeeXiaoLiang - 博客园 【转】GridView 实现服务器端和客户端全选的两种方法 ASP.NET之GridView数据绑定 - LeeXiaoLiang - 博客园 希尔排序的C语言实现(1) 简单插入排序的C语言实现 堆排序的C语言实现 对于堆排序算法的理解 【转】sqlserver中分页方法集锦 【转】高效的MySQL分页 【摘】完全二叉树 【原创】连接字符串数组 【摘】用C实现将数组转换为字符串 【原创】用C实现Trim()函数 - LeeXiaoLiang - 博客园 【转】浅谈数据库设计技巧 [转]数据库设计范式的理解
希尔排序的C语言实现(2)
LeeXiaoLiang · 2010-08-19 · via 博客园 - LeeXiaoLiang

代码

#include <stdio.h>
#include 
<stdlib.h>void ShellSort(int a[],int Index);
void PrintArray(const char* strMsg,int array[],int nLength);int main(int argc, char *argv[])
{
  
int data[13]={8,5,4,6,13,7,1,9,12,11,3,10,2};
  ShellSort(data,
13);
  
//PrintArray("Shell Sort:",data,13);
  
  system(
"PAUSE");    
  
return 0;
}
/* 希尔排序的思路:
       需要三层循环,
       第一层循环用于控制步长的变化,步长每缩减一次就进行一轮排序; 
       第二层循环用于控制按照步长所分割成的各个集合; 
       第三层循环用于针对单个集合进行插入排序; 
   注:通过画图观察步长与小组个数的关系,可以知道,对于有13个元素的数组,
       当步长为8时,可把数组分为8个小组,其中5组有2个元素,3组只有1个元素
       当步长为7时,可把数组分为7个小组,其中1组有1个元素,6组有2个元素
       当步长为6时,可把数组分为6个小组,其中1组有3个元素,5组有2个元素
       当步长为5时,可把数组分为5个小组,其中3组有3个元素,2组有2个元素
       当步长为4时,可把数组分为4个小组,其中1组有4个元素,3组有3个元素
*/
void ShellSort(int a[],int Index) {   
  
int i, j, k;    // 循环计数变量   
  int Temp;       // 暂存变量   
  int Change;     // 数据是否改变   
  int DataStep;   // 集合分割的步长   
  int Pointer;    // 进行处理的位置   

  DataStep 
= (int) Index / 2// 初始集合间隔长度   

  
while (DataStep != 0// 数列仍可进行分割  
  { 
    printf(
"========================\n");
    
// 对各个集合进行处理
    /*(在j自增至DataStep的2倍之前,j代表各小组的第二个元素的位置;
        j增至DataStep的3倍之前,j代表各小组的第三个元素的位置;依次类推。
        若j-DataStep<0说明j已经是本小组的第一个元素了。
)*/   

    for (j = DataStep; j < Index; j++) {   
      Change 
= 0;   
      Temp 
= a[j]; //保存当前集合的待排序元素到临时变量
      

      //(推算本元素的前一个元素的位置)
      Pointer 
= j - DataStep; //计算当前集合已排序元素列表的最后一个元素的位置 

      k
=0;
      
// 进行集合内数值的插入排序(边比较边向后移位) 
      while (Temp < a[Pointer] && Pointer >= 0 && Pointer <= Index) {
        printf(
"当前交换元素:%d(a[%d])-%d(a[%d])\n",a[Pointer],Pointer,a[Pointer + DataStep],Pointer + DataStep);
        
//将比待排序元素大的已排序元素后移
        a[Pointer + DataStep] = a[Pointer]; 
        PrintArray(
"本次交换结果: ",a,Index);
        
//计算下一个要比较的已排序元素的位置 
        Pointer = Pointer - DataStep; 
        Change 
= 1;
        k
++
      } 
      printf(
"本集合步长为%d,交换次数为%d\n",DataStep,k);
      
      
// (将待排序元素插入到最后的空位上) 
      a[Pointer + DataStep] = Temp;if (Change) {    
        
// 打印目前排序结果
        PrintArray("本轮排序结果: ",a,Index); 
      }   

      printf(

"------------------------\n");
    }   
    DataStep 
= DataStep / 2// 计算下次分割的间隔长度   
  }   
void PrintArray(const char* strMsg,int array[],int nLength)
{
     
int i;
     printf(
"%s",strMsg);
     
for(i=0;i<nLength;i++)
     {
        printf(
"%d ",array[i]);
     }
     printf(
"\n");
}