由快速排序引起對自己的反思

     最早接触快速排序,应该可以追逐到高二那会儿。那时候,由四个同学在一起做noip竞赛,那时候不懂什么叫算法、什么叫优化、什么叫空间效率,只知道快速排序要比其他简单的排序快。于是,为了应对考场时可能会遇到需要排序的问题,自己“学会”了快排。还记得,刚开始怎么也理解不了快速排序的思想,后来果断背下来了,好在代码不长。 当时背算法挺可笑的,但是现在想想我平常理解的算法是不是也是在背算法呢?

     快排,我至少写过50遍,因为不知道什么时候,一直把它当作调试编译环境的测试代码。但是,就在昨天的百度面试中,又被问及了快排,而我在纸上写得却一塌糊涂。面试的题目是,对链表结构的数据进行快速排序。当时有点蒙,因为之前写得都是针对数组这样带有下标的数据结构排序。我之前所写过得那么多遍快排,其中partition的思想,都是从两头low和high向中间靠拢这样的策略,保证找到分割的位置。但是链表不能这么用了,单向链表只能一个方向遍历元素。 面试的时候,我知道很多书中提及的是一种从头利用两个指针一个方向进行寻找partition的方法,但是自己却重来没有认真看过实现细节,总认为自己会一种实现策略就可以了,原理都一样。可是就是同样的思想的算法,换个实现方式,就把我搞糊涂了。 最终,导致这次面试有点悲剧。还有一次,问建堆的复杂度,我知道是O(n)的,却重来没有想过为什么?也重来没自己去证明过。

     在回学校的地铁上,我不断反思,为什么这么基础的算法代码,我却写得一塌糊涂,为什么很多以为很熟悉很熟悉的东西,稍微变换一下,自己就措手不及。究其原因,我觉得就是太自以为是了,以为理解了思想,就不深究其思想的精髓以及忽略對细节的把握。

     最近一直很迷茫,因为最近发现之前自己所设定的研究生计划几乎泡汤,实验室真的不是一般差,我對我的研究方向完全没兴趣,基本不能指望从老师那得到任何收获。另一方面,自己想找实习,却又不想找那种业务开发类型的工作,想找那种底层点、有点理论研究的职位,而自己现在的技术能力却對此还有一定差距。  现在处在我人生的低谷期,但我相信潮落之后一定有潮起! 自己要加油了~

快速排序 针对链表结构的实现(面试回来,自己写的,当时不能快速的写出来,还是自己對其理解不深刻):

#include<iostream>
#include<stdio.h>
using namespace std;

struct node {
    int value;
    node * next;
    node(int v){
        value = v;
        next = NULL;
    }
};

void qsortforlink(node * head, node * tail){
    if(head == tail || head == NULL || tail == NULL) return;
    node * x = head;
    node * p1 = head->next;
    node * p2 = head->next;
    node * p = head;
    while(p2!=NULL && p2!= tail->next){
        if(p2->value < x->value) {
            p = p1;
            swap(p1->value,p2->value);
            p1 = p1->next;
        }
        p2 = p2->next;
    }
    swap(x->value, p->value);
    qsortforlink(head,p);
    qsortforlink(p1,tail);
}
int main(){
    node * head = NULL;
    freopen("input.txt","r",stdin);
    int arr [800000];
    int length = 0;
    while(cin>>arr[length++]) {}
    int arr [] = {8,7};
    head = new node(arr[0]);
    node * p = head;
    for(int i=1;i<length;i++) {
        p->next = new node(arr[i]);
        p = p->next;
    }
    qsortforlink(head,p);
}

 

void qsort(int * arr, int low, int high){
    if(low >= high) return;
    int i = low;
    int j = high;
    int x = arr[low];
    while(i<j){
        while(arr[j]>=x && i<j) j--;
        arr[i] = arr[j];
        while(arr[i]<=x && i<j) i++;
        arr[j] = arr[i];
    }
    arr[i] = x;
    qsort(arr,low, i-1);
    qsort(arr,i+1,high);
}

 

void qsort2(int * arr, int low, int high){
    if(low>=high) return;
    int j = low+1,i;
    int x = arr[low];
    for(i=low+1;i<=high;i++){
        if (arr[i] < x){
            swap(arr[i],arr[j]);
            j++;
        }
    }
    j--;
    swap(arr[low],arr[j]);
    qsort2(arr,low,j-1);
    qsort2(arr,j+1,high);
}

 

posted @ 2013-03-09 18:54  糖拌咸鱼  阅读(1226)  评论(1编辑  收藏  举报