• 希尔排序


    希尔排序的时间复杂度,最好的情况下仍然是正序时,可达到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

    运行示例:

  • 相关阅读:
    从零到一搭建测试框架
    一文说懂join和setDaemon
    工具代码-timeout
    算法-广度优先遍历-实战-多轮状态
    调用百度AI新闻摘要API
    基于numpy用滑窗方差的办法确定曲线拐点
    python实现离线语音识别
    图床
    传智课堂的授课方案
    C#后台程序与HTML页面中JS方法互调
  • 原文地址:https://www.cnblogs.com/xing901022/p/3664089.html
Copyright © 2020-2023  润新知