zoukankan      html  css  js  c++  java
  • 排序算法 2 qsort 库函数,泛型函数

    _____谈谈排序算法

    交换排序——>冒泡排序-->快速排序

    选择排序——>简单选择排序——>堆排序

    插入排序——>直接插入排序——>希尔排序

    _____排序算法对比

    名称

    稳定性

    时间复杂度

    空间复杂度

    描述

    数据对象为链表

    平均

    最坏

    冒泡排序

    Y

    O(n^2)

    O(1)

    无序区,有序区。

     

    选择排序

     

    O(n^2)

    O(1)

    有序区,无序区

    稳定性Y,其它同数组

    插入排序

    Y

    O(n^2)

    O(1)

    有序区,无序区

    同数组

    堆排序

     

    O(n log n)

    O(1)

    最大堆,有序区

     

    归并排序

    Y

    O(n log n)

    O(n)+O(log n)

    将数据分为两段,逐段排序

    空间复杂度O(1)

    快速排序

     

    O(n log n)

    O(n^2)

    O(log n)-O(n)

    选择基数,调整方位

     

    希尔排序

     

    O(n log n)

    O(n^2)

    O(1)

    每次循环按间隔进行插入排序

     

    快速排序针对小数目数组列表的优化为最佳的排列方法。

    -------库函数

    在stdlib 中定义了qsort库函数

    void qsort (void* base, size_t num, size_t size,
                int (*compar)(const void*,const void*));
    //这是一个泛型函数,适用于不同的类型。
    int compareMyType (const void * a, const void * b)
    {
      if ( *(MyType*)a <  *(MyType*)b ) return -1;
      if ( *(MyType*)a == *(MyType*)b ) return 0;
      if ( *(MyType*)a >  *(MyType*)b ) return 1;
    }

    //我写的 

    void quickSort(void* base,size_t size,size_t low,size_t high,int (*compar)(const void*,const void*))
    {
        int left = low;
        int right = high;
        int keyPos = low;    //set the first element key
        uchar keyBuffer[size];
        if(low >= high)
            return;
        memcpy( keyBuffer, (uchar *)base + keyPos*size, size );
    
        while(right>left )
        {
              while( right>left && compar( (uchar *)base + right*size,keyBuffer )>=0)
              {
                  right--;
              }
              memcpy( (uchar *)base + left*size, (uchar *)base + right*size, size );  //right considered to store key
              while( right>left && compar(keyBuffer, (uchar *)base + left*size)>=0 )
              {
                  left++;
              }
              memcpy( (uchar *)base + right*size, (uchar *)base + left*size, size );  //left considered to store key
        }
        memcpy((uchar *)base + left*size,keyBuffer,size);
       if(left-1>0)
            quickSort(base,size,low,left-1,compar);
        quickSort(base,size,left+1,high,compar);
    }
    
    void qsort (void* base, size_t num, size_t size,
                int (*compar)(const void*,const void*))
    {
        quickSort(base,size,0,num-1,compar);
    }
  • 相关阅读:
    sql左外连接、右外连接、group by、distinct(区别)、intersect(交叉)、通配符、having
    nvarchar,varchar 区别
    链家笔试链家——找寻最小消费获取最大平均分java
    利用SpringAOP 实现 日志输出
    AOP 学习笔记
    Spring AOP中pointcut expression表达式解析
    基于@Aspect的AOP配置
    URI 中特殊字符处理
    给电脑设置视力保护色
    Spring不支持依赖注入static静态变量
  • 原文地址:https://www.cnblogs.com/aprilapril/p/4309221.html
Copyright © 2011-2022 走看看