打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

     最早接触快速排序,应该可以追逐到高二那会儿。那时候,由四个同学在一起做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);}

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
先假设再求证的解题思路
C/C++面试题大汇总6
【数据结构与算法】为什么你学不会递归?告别递归,谈谈我的一些经验
常见算法题编程8道
单链表的建立(C语言完整程序)
链表逆序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服