zoukankan      html  css  js  c++  java
  • 排序算法4---希尔排序算法,改进的直接插入排序

    #include <stdio.h>
    
    #define MAXSIZE 9  /* 用于要排序数组个数最大值,可根据需要修改 */
    typedef struct
    {
        int r[MAXSIZE+1];    /* 用于存储要排序数组,r[0]用作哨兵或临时变量 */
        int length;            /* 用于记录顺序表的长度 */
    }SqList;
    
    /* 交换L中数组r的下标为i和j的值 */
    void swap(SqList *L,int i,int j) 
    { 
        int temp=L->r[i]; 
        L->r[i]=L->r[j]; 
        L->r[j]=temp; 
    }
    
    void print(SqList L)
    {
        int i;
        for(i=1;i<=L.length;i++)
            printf("%d,",L.r[i]);
        printf("
    ");
    }
    
    /* 对顺序表L作希尔排序 */
    void shellsort(SqList * L){
        int j,i,k=0,increment=L->length;
        do{
            increment=increment/3+1;
            for(i=increment+1; i <= L->length; i++){
                if(L->r[i]<L->r[i-increment]){
                    L->r[0]=L->r[i];
                    //注意j不要出边界
                    for(j=i-increment; j>0 && L->r[j] > L->r[0]; j-=increment){
                        L->r[j+increment]=L->r[j];
                    }
                    L->r[j+increment]=L->r[0];
                }
            
            }
        printf("第%d趟排序结果为:
    ",++k);
        print(*L);
        }while(increment>1);//increment=1时是最后一趟遍历
    }
    
    int main(){
        SqList L;
        int num[10] = {9,5,3,2,4,6,1,7,8,9};    
        for(int i=0; i<10; i++){
            L.r[i]=num[i];
        }//注意给数组赋值的方法
        L.length=9;
        //希尔排序
        shellsort(&L);
        return 0;
    }


    增量的选取很关键,最好的情况下时间复杂度可达到O(n^(3/2)),要好于直接排序的O(n^2).
    希尔排序中记录是跳跃式的移动,所以希尔排序不是稳定的排序算法。
    意义:突破了慢速排序的时代(超越了O(n^2)).

  • 相关阅读:
    iOS删除Scene
    IOS如何解决强引用中的循环引用
    IOS中performSelector线程使用
    IOS中的类方法和实例方法
    Mac系统上安装Java的JDK并配置环境变量
    Java开发基本环境知识
    SVN上传工具Cornerstone的简单使用
    05--学习PHP面向对象--静态成员与常量成员
    04--学习PHP面向对象--访问权限修饰符
    03--学习PHP面向对象--$this
  • 原文地址:https://www.cnblogs.com/Allen-win/p/7298298.html
Copyright © 2011-2022 走看看