• 算法导论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前面的常数项。

  • 相关阅读:
    线上崩溃... MediaPlayerNative: error (1, -2147483648)
    Android Notification cancel和cancelAll方法无效问题
    Android ButterKnife 找不到符号
    Android日历组件
    Android dimen适配
    Android View的invalidate()原理
    Android Camera坐标系三维图及正向绕行方向
    Android 自定义多选的 Spinner
    Android中PorterDuff.Mode【转】
    java面向对象的注意点2
  • 原文地址:https://www.cnblogs.com/itlqs/p/5100637.html
Copyright © 2020-2023  润新知