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