算法导论4:快速排序 2016.1.4

  今天上最后一节史纲课,老师说不管什么学科,最重要的就是思想。我觉得很有道理。

  好吧,不扯了。原谅我看书选择了速读策略,中间有很多感觉目前还很难看懂,以后有时间再细细学习。把略过去的在这里记一下。

一、矩阵乘法算法。复杂度从n^3优化到了n^2.81 (数字比较神奇)。因为还没学线性代数,所以以后学了再看。

二、递归复杂度的计算和估计。这部分看起来有些复杂,好像需要比较高的数学水平,有空研究一下。

三、堆排序。这个以前已经写过了。http://www.cnblogs.com/itlqs/p/4750162.html

四、快速排序。

  以前一直用C语言库里自带的qsort函数。今天自己写了一下。(膜拜算法导论的整洁代码)思想还是递归(为什么高效的排序总要递归。。),大体思想是这样。我如果有一个函数

    int partition(int *a,int l,int r);  功能是让a[l..r]以其中某个数a[k]为基准,a[k]左边的都比它小,右边的都比它大,并且返回k的值。不妨把这个过程称作一次分割。

  那么对于我想排序a[1..n](从小到大)只需要分割一下,然后递归左边,递归右边。就ok了。

  代码如下:

#include<stdio.h>

int partition(int *a,int l,int r)
{
    int x=a[r];
    int i=l-1;
    int j;
    for (j=l;j<=r-1;j++) {
        if (a[j]<=x) {
            i++;
            int temp=a[i];
            a[i]=a[j];
            a[j]=temp;
        }
    }
    x=a[i+1];
    a[i+1]=a[r];
    a[r]=x;
    return i+1; 
}

void qsort(int *a,int l,int r)
{
    if (l<r) {
        int k=partition(a,l,r);
        qsort(a,l,k-1);
        qsort(a,k+1,r);
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    int a[11]={};
    int i;
    for (i=1;i<=n;i++) {
        scanf("%d",&a[i]);
    }
    qsort(a,1,n);
    for (i=1;i<=n;i++) {
        printf("%d |",a[i]);
    }
    return 0;
}

 书中也提到了,这个版本的partition并不是最初版本的,最初版本的我在假期也写过了:http://www.cnblogs.com/itlqs/p/4750049.html

但是我目前还没有办法验证这个方法的正确性。。所以以后提升提升再研究一下,目前先用这个版本比较放心。

  另外书中还提出了三数取中划分的优化,不过只影响nlgn前面的常数项。

posted @ 2016-01-04 23:28  lvmememe  阅读(290)  评论(0编辑  收藏  举报