Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103000
  • 博文数量: 24
  • 博客积分: 105
  • 博客等级: 民兵
  • 技术积分: 244
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-09 20:05
文章分类

全部博文(24)

文章存档

2015年(1)

2014年(9)

2013年(10)

2012年(4)

我的朋友

分类: C/C++

2013-05-15 20:45:20

快速排序算法原理:
1、对一个数组选定一个数作为标杆
2、把数组中比这个数“大”的数放到该数的左边
3、把数组中比这个数“小”的数放到该数的右边
4、根据标杆的位置,对标杆左右两边的数组进行调整

时间复杂度:
1、标杆数左右调整时间复杂度为O(n)
2、标杆的位置直接决定了快排的时间复杂度
    a、如果每次返回的标杆位置都位于数组中间,那么时间复杂度为O(n*logn)
    b、如果数组有序,那么标杆将是做个位置返回,此时的时间复杂度为O(n ^ 2)

同插入排序一样,使用函数指针隔离顺序变化

点击(此处)折叠或打开

  1. typedef int (*sort_comp)(void *, void *);
设定一个标杆,并进行调整(插入代码的控件太不好用),直接写吧。
static int sort_swap(int * a, int l, int r, sort_comp cmp)
{
    int sentry;//存放标杆的变量
    sentry = a[l];//把数组第一个数作为标杆
    while (l < r)
    {
        //右边开始,比标杆大则不调整
        while ((l < r) && (cmp(&sentry, &a[r]) < 0))
            r --;
        a[l] = a[r];//比标杆小则调整
        //左边开始,比标杆小则不调整
        while ((l < r) && (cmp(&sentry, &a[l]) > 0))
            l ++;
        a[r] = a[l];//比标杆大则调整
    }
    //标杆位置确定
    a[l] = sentry;
    return l;
}

根据标杆位置划定数组大小
static void _fast_sort(int * a, int l, int r, sort_comp cmp)
{
    int m;//标杆位置
    //只有一个数的数组就不调整了
    if (l >= r)
            return;
    m = sort_swap(a, l, r, cmp);//标杆位置左右已经符合右边比左边“大”
    //对标杆左边的数组进行调整
    _fast_sort(a, l, m - 1, cmp);
    //对标杆右边的数组进行调整
    _fast_sort(a,m + 1, r, cmp);
}

暴露一个排序接口给外部程序使用
int module_fast_sort(int * a, int len, sort_comp cmp)
{
    if (!a || !cmp)
        return 0;
    _fast_sort(a, 0, len - 1, cmp);
    return 1;
}


阅读(1452) | 评论(0) | 转发(0) |
0

上一篇:插入排序

下一篇:strtok的用法

给主人留下些什么吧!~~