算法


1.常用的八個(gè)基本排序算法

-前言:希爾排序和直接插入排序?qū)儆诓迦肱判蛩惴ㄖ盏伲?jiǎn)單選擇排序和堆排序?qū)儆谶x擇排序案糙,冒泡和快速排序?qū)儆诮粨Q排序,如下圖所示


排序.png

1)直接插入排序

(1)基本思想:在要排序的一組數(shù)中,假設(shè)前面(n-1)[n>=2] 個(gè)數(shù)已經(jīng)是排好順序的奥吩,現(xiàn)在要把第n 個(gè)數(shù)插到前面的有序數(shù)中,使得這n個(gè)數(shù)也是排好順序的蕊梧。如此反復(fù)循環(huán)霞赫,直到全部排好順序。
(2)例子


直接插入排序.png

(3)簡(jiǎn)單的代碼實(shí)現(xiàn)

package eight;
public class IndexSort {
    public void insertSort(){   
     int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};   
      int temp=0;   
      for(int i=1;i<a.length;i++){   
          int j=i-1;   
          temp=a[i];   
          for(;j>=0&&temp<a[j];j--){   
            a[j+1]=a[j];  //將大于temp 的值整體后移一個(gè)單位   
          }   
          a[j+1]=temp;  
          }   
      for(int i=0;i<a.length;i++){   
           System.out.println(a[i]);   
       }
       }   
  } 

2)希爾排序

(1)基本思想:算法先將要排序的一組數(shù)按某個(gè)增量 d(n/2,n為要排序數(shù)的個(gè)數(shù))分成若干組肥矢,每組中記錄的下標(biāo)相差 d.對(duì)每組中全部元素進(jìn)行直接插入排序端衰,然后再用一個(gè)較小的增量(d/2)對(duì)它進(jìn)行分組,在每組中再進(jìn)行直接插入排序甘改。當(dāng)增量減到 1 時(shí)旅东,進(jìn)行直接插入排序后,排序完成十艾。
(2)例子(待做)
(3)簡(jiǎn)單的代碼實(shí)現(xiàn)

package eight;

public class ShellSort {
    public void shellSort(){   
        int a[]={1,54,6,3,78,34,12,45,56,100};   
        double d1=a.length;   
        int temp=0;      
        while(true){   
            d1= Math.ceil(d1/2); 
            int d=(int) d1;   
            for(int x=0;x<d;x++){   
                for(int i=x+d;i<a.length;i+=d){   
                    int j=i-d;   
                    temp=a[i];   
                    for(;j>=0&&temp<a[j];j-=d){   
                        a[j+d]=a[j];   
                        }   
                     a[j+d]=temp;   
                     }   
                }    
            if(d==1){   
                break;   
            }
            }   
        for(int i=0;i<a.length;i++){   
            System.out.println(a[i]);   
        }
    }   
 }   

3)簡(jiǎn)單選擇排序

(1)基本思想:在要排序的一組數(shù)中抵代,選出最小的一個(gè)數(shù)與第一個(gè)位置的數(shù)交換;然后在剩下的數(shù)當(dāng)中再找最小的與第二個(gè)位置的數(shù)交換忘嫉,如此循環(huán)到倒數(shù)第二個(gè)數(shù)最后一個(gè)數(shù)比較為止荤牍。
(2)例子(待做)
(3)

package eight;

public class SelectSort {
    public void selectSort(){   
        int a[]={1,54,6,3,78,34,12,45};   
        int position=0;   
        for(int i=0;i<a.length;i++){        
            int j=i+1;   
            position=i;   
            int temp=a[i];   
            for(;j<a.length;j++){   
                if(a[j]<temp){   
                    temp=a[j];   
                    position=j;   
                    }    
                }   
            a[position]=a[i];   
            a[i]=temp;   
            }   
            for(int i=0;i<a.length;i++) {  
                System.out.println(a[i]);   
            }
            }   
}   

4)堆排序

(1)基本思想:堆排序是一種樹形選擇排序,是對(duì)直接選擇排序的有效改進(jìn)庆冕。 由堆定義可以看出康吵,堆頂元素(即第一個(gè)元素)必為最大項(xiàng)(大頂堆)。完全二叉樹可以很直觀地表示堆的結(jié)構(gòu)访递。堆頂為根晦嵌,其它為左子樹、右子樹。初始時(shí)把要排序的數(shù)的序列看作是一棵順序存儲(chǔ)的二叉樹耍铜,調(diào)整它們的存儲(chǔ)序邑闺,使之成為一個(gè)堆,這時(shí)堆的根節(jié)點(diǎn)的數(shù)最大棕兼。然后將根節(jié)點(diǎn)與堆的最后一個(gè)節(jié)點(diǎn)交換陡舅。然后對(duì)前面(n-1)個(gè)數(shù)重新調(diào)整使之成為堆。依此類推伴挚,直到只有兩個(gè)節(jié)點(diǎn)的堆靶衍,并對(duì)它們作交換,最后得到有 n個(gè)節(jié)點(diǎn)的有序序列茎芋。從算法描述來看颅眶,堆排序需要兩個(gè)過程,一是建立堆田弥,二是堆頂與堆的最后一個(gè)元素交換位置涛酗。所以堆排序有兩個(gè)函數(shù)組成。一是建堆的滲透函數(shù)偷厦,二是反復(fù)調(diào)用滲透函數(shù)實(shí)現(xiàn)排序的函數(shù)商叹。
(3)簡(jiǎn)單代碼實(shí)現(xiàn)

package eight;
import java.util.Arrays;  
public class HeapSort {
    int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};   
    public void HeapSort(){   
        heapSort(a);   
    }
    public  void heapSort(int[] a){
        System.out.println("開始排序");   
        int arrayLength=a.length;   //循環(huán)建堆    
        for(int i=0;i<arrayLength-1;i++){   //建堆   
            buildMaxHeap(a,arrayLength-1-i); //交換堆頂和最后一個(gè)元素   
                swap(a,0,arrayLength-1-i);   
                System.out.println(Arrays.toString(a));   
                }   
        }    
    private  void swap(int[] data, int i, int j) {
        int tmp=data[i];   
        data[i]=data[j];   
        data[j]=tmp;   
        }   //對(duì)data 數(shù)組從0到lastIndex 建大頂堆   
    private void buildMaxHeap(int[] data, int lastIndex) {   
        //從lastIndex 處節(jié)點(diǎn)(最后一個(gè)節(jié)點(diǎn))的父節(jié)點(diǎn)開始   
            for(int i=(lastIndex-1)/2;i>=0;i--){   
                int k=i;  
                while(k*2+1<=lastIndex){   
                    //k 節(jié)點(diǎn)的左子節(jié)點(diǎn)的索引  
                    int biggerIndex=2*k+1;   
                    //如果biggerIndex 小于lastIndex,即biggerIndex+1 代表的k 節(jié)點(diǎn)的右子節(jié)點(diǎn)存在   
                    if(biggerIndex<lastIndex){   
                        //若果右子節(jié)點(diǎn)的值較大   
                        if(data[biggerIndex]<data[biggerIndex+1]){   
                            //biggerIndex 總是記錄較大子節(jié)點(diǎn)的索引   
                            biggerIndex++;   
                            }   
                        }  
                    if(data[k]<data[biggerIndex]){   
                        swap(data,k,biggerIndex);    
                        //將biggerIndex 賦予k只泼,開始while 循環(huán)的下一次循環(huán)剖笙,重新保證k節(jié)點(diǎn)的值大于其左右子節(jié)點(diǎn)的值   
                        k=biggerIndex;   
                        }else{   
                            break;   
                            }   
                    }   
                }   
            }   
    } 

5)冒泡排序

6)快速排序

7)歸并排序

8)基數(shù)排序

二叉樹算法

(1)平衡二叉樹

算法相關(guān)面試題

  1. 定義一個(gè)int型的一維數(shù)組,包含10個(gè)元素请唱,分別賦一些隨機(jī)整數(shù)弥咪,然后求出所有元素的最大值,最小值十绑,平均值聚至,和值,并輸出出來孽惰。
  2. 題目:輸入兩個(gè)正整數(shù)m和n晚岭,求其最大公約數(shù)和最小公倍數(shù)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末勋功,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子库说,更是在濱河造成了極大的恐慌狂鞋,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潜的,死亡現(xiàn)場(chǎng)離奇詭異骚揍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門信不,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘲叔,“玉大人,你說我怎么就攤上這事抽活×蚋辏” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵下硕,是天一觀的道長(zhǎng)丁逝。 經(jīng)常有香客問我,道長(zhǎng)梭姓,這世上最難降的妖魔是什么霜幼? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮誉尖,結(jié)果婚禮上罪既,老公的妹妹穿的比我還像新娘。我一直安慰自己铡恕,他們只是感情好萝衩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著没咙,像睡著了一般猩谊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祭刚,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天牌捷,我揣著相機(jī)與錄音,去河邊找鬼涡驮。 笑死暗甥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捉捅。 我是一名探鬼主播撤防,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼棒口!你這毒婦竟也來了寄月?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤无牵,失蹤者是張志新(化名)和其女友劉穎漾肮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茎毁,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡克懊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谭溉。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡墙懂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扮念,到底是詐尸還是另有隱情损搬,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布扔亥,位于F島的核電站场躯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏旅挤。R本人自食惡果不足惜踢关,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粘茄。 院中可真熱鬧签舞,春花似錦、人聲如沸柒瓣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芙贫。三九已至搂鲫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磺平,已是汗流浹背魂仍。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拣挪,地道東北人擦酌。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像菠劝,于是被迫代替她去往敵國和親赊舶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • 1 序 2016年6月25日夜赶诊,帝都笼平,天下著大雨,拖著行李箱和同學(xué)在校門口照了最后一張合照甫何,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,078評(píng)論 0 12
  • 概述 排序有內(nèi)部排序和外部排序出吹,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大辙喂,一次不能容納全部...
    蟻前閱讀 5,168評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大巍耗,一次不能容納全部...
    每天刷兩次牙閱讀 3,729評(píng)論 0 15
  • 概述排序有內(nèi)部排序和外部排序秋麸,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大炬太,一次不能容納全部的...
    Luc_閱讀 2,259評(píng)論 0 35
  • 今日看到秋愷老師更新的文章《生亲族,不如死》竟然濕潤(rùn)了眼眶炒考,情不自禁 我甚至都能夠感受到,老師在寫這些字的時(shí)候霎迫,內(nèi)心的...
    炎炎的幸福部落閱讀 834評(píng)論 0 1