zoukankan      html  css  js  c++  java
  • 【算法】【排序】【插入类】希尔排序 ShellSort

    #include<stdio.h>
    #include <time.h> 
    #include<stdlib.h>
    
    int main(){
        int a[15];
        //设立随机数 
        srand(time(0));  
        for(int i=0;i<15;i++){
            a[i]=rand()%(30);    //随机数范围0到29之间 
        } 
        //数组a的大小 
        int size=sizeof(a)/4;
        //打印数组信息 
        for(int i=0;i<size;i++){
            printf("%d ",a[i]);
        }
            
        void ShellSort(int a[],int size);
        
        ShellSort(a,size);
        
        return 0;
    } 
    
    void ShellSort(int a[],int size){
        int all=size;     
        int l=size;        //比较距离 :距离l 
    
        //交换两个地址的值 
        void swap(int* i,int* j);
        
        while(true){
            //比较距离减半 
            //若比较距离为0,退出循环 
            l=l/2;
            if(l==0){
                break;
            }
            //输出比较距离的值 
            printf("
    %d
    ",l);
            
            //向右比较 
            for(int i=0;i<all-l;i++){
                //如果遇到小的值x在右边 
                if(a[i]>a[i+l]){
                    //先把当前位置的值和x交换 
                    swap(a+i,a+i+l);
                    //如果 当前位置 在当前比较距离下 曾被比较过 
                    if(i-l>=0){
                        //那么还要从此位置开始向左比较
                        for(int j=i;j-l>=0;j=j-l){
                            //直到x移动到合适的位置: *(dx-l)<*dx<*(dx+l) 
                            if(a[j]<a[j-l]){ 
                                swap(a+j,a+j-l);
                            }else{
                            //由于前面的位置已经排序过了,若遇到比x小的数就表示到达合适位置 
                                goto leftend;
                            }
                        }
                    }
                    leftend:{}
                }
            }
        //打印数组信息 
            for(int i=0;i<size;i++){
                printf("%d ",a[i]);
            }    
        }
    }
    
    
    void swap(int* i,int* j){
        int t=*j;
        *j=*i;
        *i=t;
    }
  • 相关阅读:
    正则表达式30分钟入门教程
    oracle常用的字符和字符串处理类函数
    [转载]C#实现软件自动更新思路
    ORACLE函数介绍
    xml 文件操作类
    oracle 主键生成策略
    wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换
    NSIS开始...
    Oracle分析函数详述
    常用正则表达式收集
  • 原文地址:https://www.cnblogs.com/LPworld/p/11223348.html
Copyright © 2011-2022 走看看