zoukankan      html  css  js  c++  java
  • 希尔排序

    希尔排序的时间复杂度,最好的情况下仍然是正序时,可达到O(n),平均复杂度为O(nlogn)。

    算法思想:

      采用跳跃式处理数组,使得数组粗粒度的实现基本有序。在进行细粒度的处理,最终使得网络在跳越数为1时,实现基本有序的排序,以减少插入排序的复杂度。

    主要程序:

    void shellSort(int *arr,int length){
        int i,j,k;
        int increment = length;
        while(increment>0){
            if(increment != 1)
                increment = increment/3+1;
            else
                break;
            for(i = increment; i<length; i++){
                if(arr[i] < arr[i-increment]){
                    k = arr[i];
                    for(j=i-increment; j>=0 && k < arr[j] ; j-=increment){
                        arr[j+increment] = arr[j];
                    }
                    arr[j+increment] = k;
                }
            }
        }
    }

    全部代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int arrtest1[10] = {3,4,7,8,0,9,1,2,6,5};
    int arrtest2[10] = {0,1,2,3,4,5,6,7,8,9};
    int arrtest3[10] = {9,8,7,6,5,4,3,2,1,0};
    void copy(int *from,int *arr,int length);
    void print(int *arr,int length);
    void shellSort(int *arr,int length);
    int main(){
        clock_t start,end;
        int Arr[10];
        int i;
        copy(arrtest1,Arr,10);
        print(Arr,10);
        shellSort(Arr,10);
        print(Arr,10);
        start = clock();
        for(i=0;i<100000;i++){
            copy(arrtest1,Arr,10);
            //print(Arr,10);
            shellSort(Arr,10);
            //print(Arr,10);
        }
        end = clock();
        printf("first test:%d
    ",end-start);
    
        start = clock();
        for(i=0;i<100000;i++){
            copy(arrtest2,Arr,10);
            //print(Arr,10);
            shellSort(Arr,10);
            //print(Arr,10);
        }
        end = clock();
        printf("first test:%d
    ",end-start);
    
        start = clock();
        for(i=0;i<100000;i++){
            copy(arrtest3,Arr,10);
            //print(Arr,10);
            shellSort(Arr,10);
            //print(Arr,10);
        }
        end = clock();
        printf("first test:%d
    ",end-start);
        
        getchar();
        return 0;
    }
    void shellSort(int *arr,int length){
        int i,j,k;
        int increment = length;
        while(increment>0){
            if(increment != 1)
                increment = increment/3+1;
            else
                break;
            for(i = increment; i<length; i++){
                if(arr[i] < arr[i-increment]){
                    k = arr[i];
                    for(j=i-increment; j>=0 && k < arr[j] ; j-=increment){
                        arr[j+increment] = arr[j];
                    }
                    arr[j+increment] = k;
                }
            }
        }
    }
    void copy(int *from,int *arr,int length){
        int i;
        for(i=0;i<length;i++){
            arr[i] = from[i];
        }
    }
    
    void print(int *arr,int length){
        int i;
        for(i=0;i<length;i++){
            printf("%d ",arr[i]);
        }
        printf("
    ");
    }
    View Code

    运行示例:

  • 相关阅读:
    剑指offer03-04
    五大算法-1.回溯法
    linux与操作系统(1)- 用户接口
    python中的装饰器
    mysql 创建数据库,用户并给用户设置权限
    centOS6.5 桌面状态栏消失 解决
    centOS linux 远程Mysql 记录之root用户密码丢失
    XStream.toXML() 简单两种使用实例
    FileInputStream和FileOutStream 简单的使用实例;
    orale 行转列或者 字符拼接函数 wmsys.wm_concat()函数 /instr(listagg(name,';') within group (order by o.srclinkedid)
  • 原文地址:https://www.cnblogs.com/xing901022/p/3664089.html
Copyright © 2011-2022 走看看