快排是所有排序算法中平均性能最好的一种排序,虽然它的最坏的情况和冒泡排序一样是 N^2。 但是平均来说为o(N*logN)。现在研究生又开始学算法了,主要是随机算法,分布式算法,和概率算法。第一节课讲的是随机化的快速排序,但是我觉得当N比较小的时候不适合随机算法,因为随机的过程也在花费时间,至于多少我也没有研究。
敲代码是要花费时间的,这个能力真心很弱,本来打算10分钟应该就可以写出来,结果花了几个小时,网上对数组划分的那个key的位置一般都是第一个或者是最后一个,我本来打算让快排的位置随机化,但是感觉很复杂。先在这里记录下吧,我要读书!!!!还有好多书没有读
这是在网络上看到的一些话:
很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。
奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。
所以,阅读一百本计算机著作吧,少年!
下面是随机的快速排序。和网上的版本都差不多,我也就不多解释了。
#include <stdio.h>
#include <algorithm>
#include <time.h>
#define M 10
int data[M];
int partition(int *a, int p, int r)
{
// int cur = (p+r)/2;
// int key = a[cur];
int key = a[p];
while(p < r)
{
for(; r>p; r--)
if(a[r] < key)
{
a[p] = a[r];
break;
}
for(; p<r; p++)
if(a[p] > key)
{
a[r] = a[p];
break;
}
}
a[p] = key;
return p;
}
int Random_partition(int *a, int p, int r)
{
int i, temp;
srand(time(0));
i = p + (int)(r-p+1)*rand()/(RAND_MAX+1.0);
temp = a[p];
a[p] = a[i];
a[i] = temp;
return partition(a, p, r);
}
void QuickSort(int *data, int begin, int end)
{
if(end>begin)
{
int q = Random_partition(data, begin, end);
QuickSort(data, begin, q-1);
QuickSort(data, q+1, end);
}
}
int main()
{
int n;
scanf("%d", &n);
for(int i=0; i<n; i++)
scanf("%d", &data[i]);
QuickSort(data, 0, n-1);
for(int i=0; i<n; i++)
printf("%d ", data[i]);
printf("\n");
}