zoukankan      html  css  js  c++  java
  • 由快速排序引起對自己的反思

         最早接触快速排序,应该可以追逐到高二那会儿。那时候,由四个同学在一起做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);
    }
  • 相关阅读:
    2021微软Power BI 每月功能更新系列——Power BI 6月版本功能完整解读 ​
    Power Automate实例应用
    微软Power BI 每月功能更新系列——2021年4月版本功能更新全面解读
    Power Apps 应用:构建一套简易的五一休假报备管理系统(一)
    如何在Azure上使用 Python 创建ADF
    微软Power BI 每月功能更新系列——2021年3月版本功能更新全面解读
    Power BI 制作技巧 — 按钮动画效果
    连接到Power BI Premium或 Azure Analysis Services时,如何更改Excel中的用户帐户
    在 Power BI 中连接到 SAP HANA 数据库
    2021微软Power BI 每月功能更新系列——Power BI 2月版本功能完整解读
  • 原文地址:https://www.cnblogs.com/coser/p/2951831.html
Copyright © 2011-2022 走看看