日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
你所能用到的數(shù)據(jù)結(jié)構(gòu)(二)

 先回答幾個(gè)留言中的一個(gè)問題和我對無損編碼那一節(jié)的一個(gè)留言的一個(gè)看法,***個(gè)是推薦算法書,首先,我不是什么高手和大牛,所以當(dāng)不起“推薦”這個(gè)詞。我見過很多人,對于這個(gè)問題我覺得很多人都會說出《算法導(dǎo)論》,但是我不完全這么認(rèn)為,我始終認(rèn)為人和人是不一樣的,《算法導(dǎo)論》肯定是一本經(jīng)典的書,但是學(xué)習(xí)知識的目的是要學(xué)懂,比誰的能力大不是比誰看的經(jīng)典書籍多,而是比誰懂得多。所以如果讓我推薦的話,我覺得要分三種情況,***種,你有很深的數(shù)學(xué)基礎(chǔ),高中特別喜歡做數(shù)學(xué)題,我覺得可以嘗試看看《算法導(dǎo)論》甚至是傳說中的《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》,第二種就是高中并不對數(shù)學(xué)很感興趣,但是大學(xué)確實(shí)很喜歡編程但是對于數(shù)學(xué)看多了覺得頭會昏昏的人,其實(shí)我特別覺得好的是《算法概論》和《算法設(shè)計(jì)與分析基礎(chǔ)》,除了這兩本,我覺得看一些《離散數(shù)學(xué)》對于培養(yǎng)算法的基本思維方式真很有幫助,第三種是對于數(shù)學(xué)理解不是那么強(qiáng)的,我覺得不妨看看《編程之美》這類的有實(shí)際例子不會那么抽象的書,培養(yǎng)出興趣,有了興趣,后面只是時(shí)間問題了。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),河南企業(yè)網(wǎng)站建設(shè),河南品牌網(wǎng)站建設(shè),網(wǎng)站定制,河南網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,河南網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

      第二個(gè)是對無損編碼有一個(gè)朋友說的這是“時(shí)間換空間”,從編程上說確實(shí)是時(shí)間換空間,但是這些一般都是在有實(shí)際應(yīng)用背景下的,比如我的所謂研究方向是“可逆水印”,這個(gè)玩意兒必須要靠無損編碼做前期處理,所以這個(gè)看法是正確的,但是卻不是最需要考慮的,因?yàn)檫@個(gè)有應(yīng)用背景。

      好了,開始這次的內(nèi)容,不同于很多數(shù)據(jù)結(jié)構(gòu)先從列表和堆棧說起,我先幾個(gè)和數(shù)據(jù)結(jié)構(gòu)結(jié)合不太強(qiáng)的排序算法開始,因?yàn)槲矣X得在學(xué)這一系列之前對算法的效率建立一個(gè)認(rèn)識是必要的。

二、從幾種“屌絲”的排序算法開始

      先介紹幾種簡單的時(shí)間效率是O(N*N)的排序算法,雖然這些排序算法比較初級,但是任何高級的東西都是從初級的東西演化推理出來的,不學(xué)小學(xué)的123你也不可能學(xué)會高數(shù)的微積分。所以說這些算法雖然“屌絲”,但是沒有這些“屌絲”哪來的“高帥富”?可以證明的出來,通過交換的排序算法效率最快只能到O(N*logN)。

      除了上面的這個(gè),我還想強(qiáng)調(diào)的一點(diǎn)是在有的書里面提到的排序算法是否是穩(wěn)定的這個(gè)概念,所謂有序就是說待排序數(shù)列中相等的值在經(jīng)過排序算法之后是否會交換位置,比如一組數(shù)據(jù)(2,0,2),在排序之后自然是(0,2,2),如果這個(gè)排序算法是穩(wěn)定的,那么(0,2,2)中***個(gè)出現(xiàn)的2應(yīng)該是(2,0,2)中的***個(gè)2,也就是待排序數(shù)列中的兩個(gè)2的相對位置不會發(fā)生交換。關(guān)于穩(wěn)定的定義可以參看百度的這個(gè)http://baike.baidu.com/view/547325.htm?fromTaglist 這個(gè)看似不起眼的知識點(diǎn)就是昨天微軟校園招聘倒數(shù)第二題的考點(diǎn),不得不說大公司出的題目牛逼。

     選擇排序是最為符合人類自然思維的一種排序方式,不斷找到數(shù)列中的最小值,將其放在目前最小的位置上,簡單方便快捷,不得不說是最“屌絲”的排序算法,沒有什么特殊的技巧,完全靠兩個(gè)循環(huán),代碼如下所示:

 
 
 
 
  1. void SelectionSort(int a[],int length) 
  2.     for(int i=0;i
  3.     { 
  4.         cout<<"Sort time number "<<(i+1)<<":"; 
  5.                int min=i;         
  6.         int j=i; 
  7.         for(;j
  8.         { 
  9.             if(a[min]>a[j]) 
  10.                min=j; 
  11.         } 
  12.         int tmp=a[min]; 
  13.         a[min]=a[i]; 
  14.         a[i]=tmp; 
  15.  
  16.         for(int k=0;k
  17.             cout<
  18.         cout<
  19.  
  20.     } 

    運(yùn)行結(jié)果如下所示:

    

    從結(jié)果中可以看到,***輪排序中,最小的元素3被安排在了***個(gè)位置上,第二輪5被安排在次小的位置上,以此類推。選擇排序算法是不是穩(wěn)定的呢?選擇排序明顯不是有序的,就像連接里面寫的那樣,因?yàn)槟阍诮粨Q的過程中,如果出現(xiàn)相同的元素,無法保證交換的過程中元素被交換的位置是否在第二次出現(xiàn)該元素之后。

    接下來當(dāng)然是冒泡排序,這種排序算法通過不斷比較相鄰兩個(gè)數(shù)的大小并交換位置來達(dá)到排序的目的,這種算法比較符合人類的自然思維,這樣就自然需要兩個(gè)循環(huán),***個(gè)循環(huán)是遍歷整個(gè)數(shù)組,第二個(gè)循環(huán)是不停地未排序的數(shù)列中兩個(gè)相鄰的元素,每一輪之后,***的元素都可以排在目前***的位置(當(dāng)然這取決于你的比較部分的代碼是如何寫的),所以這個(gè)算法也很容易寫出來。

 
 
 
 
  1. void bubble(int a[],int length) 
  2.     int temp=0; 
  3.     for(int j=0;j
  4.     {  
  5.        cout<<"Sort time number "<<(j+1)<<":"; 
  6.        
  7.        for (int i=0;i
  8.         if (a[i]>a[i+1]) 
  9.         {  
  10.             temp=a[i]; 
  11.             a[i]=a[i+1]; 
  12.             a[i+1]=temp; 
  13.         } 
  14.         for(int k=0;k
  15.          cout<
  16.         cout<
  17.     } 
  18.  

     其結(jié)果如下圖所示:

     

     這個(gè)簡單的排序算法卻反應(yīng)出了排序算法的一個(gè)最初級的思路就是比較和交換,別小看任何不起眼的概念,因?yàn)楹竺娲笈儗τ谂判蛩惴ǖ母倪M(jìn)就是通過相近辦法減少比較和交換,或者是不做相鄰元素的比較??梢钥吹矫恳惶伺判蛑螅?dāng)前***的元素都到了當(dāng)前***的位置上,冒泡排序算法是穩(wěn)定的排序算法,但是前提是你不會在比較的過程中使用<=或者>=這種符號,交換兩個(gè)相等的元素是沒有意義的,加上算法一般是到大數(shù)據(jù)集中才顯示出作用,這些環(huán)境下一個(gè)重要的因子就是要快,這種交換會無謂的增大程序的開銷,所以一般在排序算法中不會用到=的交換,你也就不用鉆牛角尖的說排序算法的穩(wěn)定性會取決于用于比較的符號。

      除了冒泡排序,插入排序我覺得是***人的排序自然思維方式的拓展,這個(gè)算法的思想基本就是不停地排出有序的數(shù)列,比如10個(gè)數(shù),先將前兩個(gè)數(shù)的順序排好,再看第三個(gè)數(shù),然后將這三個(gè)數(shù)排好,不斷吸收元素,不斷的排序,這樣會保持了待排序數(shù)列的相對穩(wěn)定性,也保持了算法排序的穩(wěn)定性。其實(shí)現(xiàn)代碼如下:

 
 
 
 
  1. void InsertSort(int numbers[],int array_size) 
  2.     int j; 
  3.     for(int p=1;p
  4.     { 
  5.         cout<<"Sort time number "<
  6.         int tmp=numbers[p]; 
  7.          
  8.         for(j=p;j>0&&tmp
  9.         { 
  10.              numbers[j]=numbers[j-1]; 
  11.         } 
  12.         numbers[j]=tmp; 
  13.        for(int k=0;k
  14.          cout<
  15.         cout<
  16.     } 

      實(shí)現(xiàn)結(jié)果如下圖所示:

     

     可以看到這種排序算法,吸收,排序的特點(diǎn),最開始是兩個(gè)元素的數(shù)組編程有序的,第二次是3個(gè)元素變成的,如此往復(fù)。

     這三種最簡單的排序算法是排序算法的入門,如果想測試其效率,可以使用我上一節(jié)的代碼,這里我還要說一句的是,我寫的這三段代碼參數(shù)的命名都是不一樣的,這是因?yàn)槲沂呛脦滋鞂懙?,這也反過來說明了在軟件開發(fā)中有一個(gè)規(guī)范的重要性,試想如果是很多人一起開發(fā)軟件,一樣的參數(shù)意思,你今天想到用著表示,明天想到用那個(gè)表示,對于別人這是一種莫大的痛苦。

原文鏈接:http://www.cnblogs.com/ZXYloveFR/archive/2012/09/23/2698563.html

【編輯推薦】

  1. Java數(shù)據(jù)結(jié)構(gòu):棧的實(shí)現(xiàn)
  2. 淺談C++開發(fā)中數(shù)據(jù)結(jié)構(gòu)和算法的分離
  3. 從淘寶數(shù)據(jù)結(jié)構(gòu)來看電子商務(wù)中商品屬性設(shè)計(jì)
  4. 如何用Perl關(guān)聯(lián)數(shù)組創(chuàng)建數(shù)據(jù)結(jié)構(gòu)
  5. 詳細(xì)介紹C++中的虛函數(shù)和動態(tài)聯(lián)編

網(wǎng)頁標(biāo)題:你所能用到的數(shù)據(jù)結(jié)構(gòu)(二)
網(wǎng)頁鏈接:http://www.5511xx.com/article/cciohjc.html