面試復(fù)習(xí)(四)算法與數(shù)據(jù)結(jié)構(gòu)篇

  • 排序算法

    • 冒泡:由后往前每兩個數(shù)對比各拷,逆序則交換严蓖,否則不動寞钥。

        int temp;
        for(int i=0;i<length;i++){
            for(int j=length-1;j>i;j--){
                if(a[j]<a[j-1]){
                    //temp交換
                }
            }
        }
      
      • o(n*n)
      • 優(yōu)化:若未循環(huán)完成便排好序:設(shè)置flag土铺,若發(fā)生交換則繼續(xù)下一輪比較出刷,否則停止
    • 選擇排序:遍歷后[length-i]個數(shù)找出最小值與與第i 個數(shù)交換

      • o(n*n)
    • 插入排序:由前往后,每輪將第i+1個數(shù)與前i個數(shù)對比姨裸,找到其在前i+1個數(shù)中的位置

        int temp;
        for(int i=0;i<length-1;i++){
            for(int j=i+1;j>0;j--){
                if(a[j]<a[j-1]){
                    //交換值
                }
            }
        }
      
      • o(n*n)秧倾,交換次數(shù)與數(shù)組初始順序有關(guān)
      • 改進(jìn)方法:比較后將較大元素右移
    • 希爾排序:快速的插入排序,將數(shù)組按一定間隔(>N/3)分為若干組傀缩,每組內(nèi)進(jìn)行插入排序那先,適用于中等大小數(shù)組

        int temp;
        int space = length
        while(space>1){
            space=space/2;
            for(int k=0;k<space;k++){//分組
                //每組內(nèi)對比循環(huán)
                for(int i=k+space;i<length;i+=space){
                    for(int j=i;j>k;j-=space){
                        if(a[j]<a[j-space]){//交換}
                    }
                }
            }   
        }
      
    • 歸并排序:將數(shù)組一分為二,分別進(jìn)行排序赡艰,然后將結(jié)果合并至第三個數(shù)組售淡,比較兩組第一個值,并取最小值為新數(shù)組第一位瞄摊,并刪去原數(shù)組中被取的值勋又,然后繼續(xù)比較原數(shù)組第一位并取小值放入新數(shù)組。實際中首先分為一個數(shù)為一組换帜,進(jìn)行兩兩合并直到合并為一個數(shù)組。

      • o(NlogN)
      • 原地歸并:
    • 快速排序:數(shù)組中取第一個數(shù)作為key值鹤啡,將比其小的方左邊惯驼,大的放右邊;再在左右兩子數(shù)組中隨機(jī)選key值重復(fù)排列,直到各區(qū)間只有一個數(shù)

        public static void quickSort(int a[],int l;int r){
            if(l>=r) return;//左右數(shù)組起始位置相同祟牲,即每段只有一個數(shù)時打破遞歸
            
            int i=l;int j=r;int key=a[l];
            while(i<j){
                while((a[i] <= key)?true:false)
            }
        }
      
      • 改進(jìn):
        • 在小數(shù)組中效率不如插入排序隙畜,可以在數(shù)組到達(dá)較小值時不再進(jìn)行下一步迭代,然后改用插入排序
        • 自數(shù)組中部分元素中位數(shù)切分?jǐn)?shù)組
  • 隊列说贝、棧

    • 棧:(棧頂)后進(jìn)先出议惰,可用數(shù)組或鏈表表示
      • 順序棧:地址連續(xù)的存儲單元依次存放自棧底到棧頂頂元素,并設(shè)置top指針指向棧頂?shù)奈恢茫╰op.next 為棧頂元素),base指針指向棧底(a[length-1])乡恕。初始分配基本容量言询,空間不足時再擴(kuò)大
      • 鏈表棧:棧頂元素作為第一個結(jié)點,棧底元素作為最后一個結(jié)點
    • 隊:先進(jìn)(隊尾)先出(隊頭)傲宜,只允許在隊尾添加隊頭刪除运杭,數(shù)組或鏈表表示
      • 鏈隊列:頭指針->頭結(jié)點->隊列結(jié)點<-尾指針,隊為空時頭尾指針均指向頭結(jié)點
      • 順序隊列:地址連續(xù)的存儲單元依次存放隊頭到隊尾的元素函卒。初始時pfront->a[0],prear->a[0]辆憔。插入時pfront地址加一
      • 雙端隊列:兩頭都可以添加刪除
  • 數(shù)組、鏈表

    • 數(shù)組:一塊連續(xù)空間保存數(shù)據(jù)报嵌,分配內(nèi)存時大小固定
      • 根據(jù)下標(biāo)訪問o(1),查找指定數(shù)據(jù)o(n)虱咧,插入或刪除任意位置元素,其后元素都要移動
    • 鏈表:不連續(xù)的內(nèi)存單元中保存數(shù)據(jù)(data與指針next)锚国,大小不固定腕巡。頭指針->(頭結(jié)點->)結(jié)點->null
      • 訪問第i個元素與查找指定數(shù)據(jù)o(n),插入刪除o(1)
      • 雙向鏈表:插入與刪除
      • 循環(huán)列表:最后一個元素指針指向頭結(jié)點而不是null跷叉,遍歷條件為元素指針是否等于頭指針
      • 雙向循環(huán)鏈表
      • 靜態(tài)列表:數(shù)組加指針逸雹,由指針指明該數(shù)組元素在鏈表中的結(jié)點位置
      • 翻轉(zhuǎn)
        • 迭代:保證臨時指針p指向原鏈表剩余部分的頭,否則原鏈表將不能遍歷

          1.0->1->2->3->null

          2.新增p->2,0-><-1,p->2->3->null

          3.p->3->null,0-><-1<-2

          4.p->null,0-><-1<-2<-3

          5.null<-0<-1<-2<-3

            Node pre = head.next;Node cur = pre.next();Node p;//頭結(jié)點指向第一個結(jié)點云挟,可以包含鏈表附加信息
            while(cur != null){
                p = cur.next();
                cur.next = pre;
                pre = cur;
                cur = p;
            }
            head.next = pre;
          
        • 遞歸:遞歸找到最后一個結(jié)點梆砸,反回上一層遞歸,改變翻轉(zhuǎn)下一結(jié)點指針园欣,并將當(dāng)前結(jié)點指向null帖世,然后返回新的頭結(jié)點,保存其在遞歸中不變

            reverse(Node H){
                //鏈表為空或H到達(dá)尾結(jié)點
                if(H==null||H.next==null) return H;
                Node NewHead = reverse(H.next);//遞歸到鏈尾
                H.next.next = H;//到達(dá)鏈尾返回上一層遞歸中
                H.next = null;
                return NewHead;//遞歸中保持新的第一個結(jié)點不變
            }
          
        • 合并:有序鏈表La,Lb鏈表合并到Lc沸枯,借助3個指針分別指向La日矫、Lb頭結(jié)點和Lc尾結(jié)點

          Node pa = La.head.next;Node pb = Lb.head.next;
          Node pc = Lc.head;
          while(pa!=null && pb!=null){
          if(pa.val <= pb.val){
          pc.next = pa;
          pc = pa;
          pa = pa.next;
          }else{
          pc.next = pb;
          pc = pb;
          pb = pb.next;
          }
          pc.next = (pa == null)?pb:pa;//插入剩余鏈表
          }

  • 堆排序:

    • 無序組排為小頂堆/大頂堆:
      • 從最后一個尾結(jié)點(arr.length-1)對應(yīng)的非葉結(jié)點(i=arr.length/2-1)開始,對比該非葉結(jié)點與其子樹大小并交換

          for(k=i*2+1;k<length;k=k*2+1){ //每層左右子節(jié)點遍歷完后再便利子節(jié)點的子樹
              //左右子節(jié)點中最大值交換
              if(k+1<length && a[k]<a[k+1]){
                  k++; //移到右子節(jié)點
              }
              if(a[k]>a[i]){
                  //交換
              }else{break;}               
          }   
        
    • 將堆頂元素(arr[0])與堆尾元素(arr[length-1])交換绑榴,移出堆尾最值哪轿,并重新排列a[0]到a[length-2]的堆
    • 選擇排序,時間復(fù)雜度o(nlogn),空間復(fù)雜度o(1)
  • 廣義表:線性表(數(shù)組翔怎、鏈表)的推廣窃诉,結(jié)點可以時元素或廣義表

  • 查找

    • 二分查找:有序表中杨耙,取中間的記錄作為比較關(guān)鍵字,若給定值與中間記錄的關(guān)鍵字相等飘痛,則查找成功珊膜;若給定的值小于中間記錄的關(guān)鍵字,則在中間記錄的左半?yún)^(qū)間繼續(xù)查找宣脉;若給定值大于中間記錄的關(guān)鍵字车柠,則在中間記錄的右半?yún)^(qū)間繼續(xù)查找;不斷重復(fù)這個過程塑猖,直到查找成功竹祷。否則查找失敗。最好o(1)萌庆,最壞o(logn)
    • 差值查找
    • 順序查找:遍歷o(n)
    • 二叉樹查找:左分支小于右分支數(shù)據(jù)
    • hash表查找
  • 二叉樹遍歷

    • 先序遍歷:根左右

        b_tree(BTree pTree){
            if(pTree){
                sout(pTree.data);
                if(pTree.lChild) b_tree(pTree.lChild);
                if(pTree.rChild) b_tree(pTree.rChild);
            }
        }
      
    • 中序遍歷:左根右

        b_tree(BTree pTree){
            if(pTree){
                if(pTree.lChild) b_tree(pTree.lChild);
                sout(pTree.data);
                if(pTree.rChild) b_tree(pTree.rChild);
            }
        }   
      
    • 后序遍歷:左右根

        b_tree(BTree pTree){
            if(pTree){
                if(pTree.lChild) b_tree(pTree.lChild);
                if(pTree.rChild) b_tree(pTree.rChild);
                sout(pTree.data);
            }
        }   
      
  • 二叉樹反轉(zhuǎn)(對每一個父結(jié)點交換其左右子結(jié)點)

          reverse(BTree pTree){
              if (pTree){
                  swap(pTree.lChild,pTree.rChild);
                  reverse(pTree.lChild);
                  reverse(pTree.rChild);
              }
              return pTree;
          }
    
  • 二叉樹相關(guān)算法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溶褪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子践险,更是在濱河造成了極大的恐慌猿妈,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巍虫,死亡現(xiàn)場離奇詭異彭则,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)占遥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門俯抖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓦胎,你說我怎么就攤上這事芬萍。” “怎么了搔啊?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵柬祠,是天一觀的道長。 經(jīng)常有香客問我负芋,道長漫蛔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任旧蛾,我火速辦了婚禮莽龟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锨天。我一直安慰自己毯盈,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布病袄。 她就那樣靜靜地躺著奶镶,像睡著了一般迟赃。 火紅的嫁衣襯著肌膚如雪陪拘。 梳的紋絲不亂的頭發(fā)上厂镇,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機(jī)與錄音左刽,去河邊找鬼捺信。 笑死,一個胖子當(dāng)著我的面吹牛欠痴,可吹牛的內(nèi)容都是我干的迄靠。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼喇辽,長吁一口氣:“原來是場噩夢啊……” “哼掌挚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起菩咨,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤吠式,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抽米,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體特占,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年云茸,在試婚紗的時候發(fā)現(xiàn)自己被綠了是目。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡标捺,死狀恐怖懊纳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亡容,我是刑警寧澤嗤疯,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站萍倡,受9級特大地震影響身弊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜列敲,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一阱佛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戴而,春花似錦凑术、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽催首。三九已至,卻和暖如春泄鹏,著一層夾襖步出監(jiān)牢的瞬間郎任,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工备籽, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留舶治,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓车猬,卻偏偏與公主長得像霉猛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子珠闰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容