① C語言中有哪些經典的排序方法
有選擇排序法和冒泡排序法兩種,都是非常經典的排序方法,都是作為一個程序員必須掌握的排序方法。
這兩種的區別在比較的邏輯不相同,因此if中的判斷條件與for循環中的代碼也是不相同的,要根據實際情況選擇不同的排序方法。
② 快速排序演算法原理與實現
快速排序的基本思想就是從一個數組中任意挑選一個元素(通常來說會選擇最左邊的元素)作為中軸元素,將剩下的元素以中軸元素作為比較的標准,將小於等於中軸元素的放到中軸元素的左邊,將大於中軸元素的放到中軸元素的右邊。
然後以當前中軸元素的位置為界,將左半部分子數組和右半部分子數組看成兩個新的數組,重復上述操作,直到子數組的元素個數小於等於1(因為一個元素的數組必定是有序的)。
以下的代碼中會常常使用交換數組中兩個元素值的Swap方法,其代碼如下
publicstaticvoidSwap(int[] A, inti, intj){
inttmp;
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
(2)程序員選擇類排序法擴展閱讀:
快速排序演算法 的基本思想是:將所要進行排序的數分為左右兩個部分,其中一部分的所有數據都比另外一 部分的數據小,然後將所分得的兩部分數據進行同樣的劃分,重復執行以上的劃分操作,直 到所有要進行排序的數據變為有序為止。
定義兩個變數low和high,將low、high分別設置為要進行排序的序列的起始元素和最後一個元素的下標。第一次,low和high的取值分別為0和n-1,接下來的每次取值由劃分得到的序列起始元素和最後一個元素的下標來決定。
定義一個變數key,接下來以key的取值為基準將數組A劃分為左右兩個部分,通 常,key值為要進行排序序列的第一個元素值。第一次的取值為A[0],以後毎次取值由要劃 分序列的起始元素決定。
從high所指向的數組元素開始向左掃描,掃描的同時將下標為high的數組元素依次與劃分基準值key進行比較操作,直到high不大於low或找到第一個小於基準值key的數組元素,然後將該值賦值給low所指向的數組元素,同時將low右移一個位置。
如果low依然小於high,那麼由low所指向的數組元素開始向右掃描,掃描的同時將下標為low的數組元素值依次與劃分的基準值key進行比較操作,直到low不小於high或找到第一個大於基準值key的數組元素,然後將該值賦給high所指向的數組元素,同時將high左移一個位置。
重復步驟(3) (4),直到low的植不小於high為止,這時成功劃分後得到的左右兩部分分別為A[low……pos-1]和A[pos+1……high],其中,pos下標所對應的數組元素的值就是進行劃分的基準值key,所以在劃分結束時還要將下標為pos的數組元素賦值 為 key。
③ java怎麼讓數組的數字從大到小排序
將數字從大到小排序的方法:
例如簡一點的冒泡排序,將第一個數字和後面的數字逐個比較大小,如果小於,則互換位置,大於則不動。此時,第一個數為數組中的最大數。然後再將第二個數與後面的數逐個比較,以次類推。
示例代碼如下:
publicclassTest{
publicstaticvoidmain(String[]args){
int[]array={12,3,1254,235,435,236,25,34,23};
inttemp;
for(inti=0;i<array.length;i++){
for(intj=i+1;j<array.length;j++){
if(array[i]<array[j]){
temp=array[i];
array[i]=array[j];
array[j]=temp; //兩個數交換位置
}
}
}
for(inti=0;i<array.length;i++){
System.out.print(array[i]+"");
}
}
}
數組對於每一門編程語言來說都是重要的數據結構之一,當然不同語言對數組的實現及處理也不盡相同。
Java 語言中提供的數組是用來存儲固定大小的同類型元素。
你可以聲明一個數組變數,如 numbers[100] 來代替直接聲明 100 個獨立變數 number0,number1,....,number99
(3)程序員選擇類排序法擴展閱讀
Java中利用數組進行數字排序一般有4種方法:
1、選擇排序是先將數組中的第一個數作為最大或最小數,然後通過循環比較交換最大數或最小數與一輪比較中第一個數位置進行排序。
2、冒泡排序也是先將數組中的第一個數作為最大或最小數,循環比較相鄰兩個數的大小,滿足條件就互換位置,將最大數或最小數沉底。
3、快速排序法主要是運用Arrays類中的Arrays.sort方法()實現。
4、插入排序是選擇一個數組中的數據,通過不斷的插入比較最後進行排序。
④ 計算機二級c語言考些什麼
公共基礎知識
基本要求
1. 掌握演算法的基本概念。
2. 掌握基本數據結構及其操作。
3. 掌握基本排序和查找演算法。
4. 掌握逐步求精的結構化程序設計方法。
5. 掌握軟體工程的基本方法,具有初步應用相關技術進行軟體開發的能力。
6. 掌握數據的基本知識,了解關系資料庫的設計。
考試內容
一、 基本數據結構與演算法
1. 演算法的基本概念;演算法復雜度的概念和意義(時間復雜度與空間復雜度)。
2. 數據結構的定義;數據的邏輯結構與存儲結構;數據結構的圖形表示;線性結構與非線性結構的概念。
3. 線性表的定義;線性表的順序存儲結構及其插入與刪除運算。
4. 棧和隊列的定義;棧和隊列的順序存儲結構及其基本運算。
5. 線性單鏈表、雙向鏈表與循環鏈表的結構及其基本運算。
6. 樹的基本概念;二叉樹的定義及其存儲結構;二叉樹的前序、中序和後序遍歷。(前序、中序和後序遍歷有考到,每年都有)
7. 順序查找與二分法查找演算法;基本排序演算法(交換類排序,選擇類排序,插入類排序)。
二、 程序設計基礎
1. 程序設計方法與風格。
2. 結構化程序設計。
3. 面向對象的程序設計方法,對象,方法,屬性及繼承與多態性。
三、 軟體工程基礎
1. 軟體工程基本概念,軟體生命周戎概念,軟體工具與軟體開發環境。
2. 結構化分析方法,數據流圖,數據字典,軟體需求規格說明書。
3. 結構化設計方法,總體設計與詳細設計。
4. 軟體測試的方法,白盒測試與黑盒測試,測試用例設計,軟體測試的實施,單元測試、集成測試和系統測試。
5. 程序的調試,靜態調試與動態調試。
四、 資料庫設計基礎
1. 資料庫的基本概念:資料庫,資料庫管理系統,資料庫系統。
2. 數據模型,實體聯系模型及E-R圖,從E-R圖導出關系數據模型。
3. 關系代數運算,包括集合運算及選擇、投影、連接運算,資料庫規范化理論。
4. 資料庫設計方法和步驟:需求分析、概念設計、邏輯設計和物理設計的相關策略。
考試方式
1、 公共基礎的考試方式為筆試,與C語言(VisualBASIC、Visual FoxPro、Java、Access、Visual C++)的筆試部分合為一張試卷。公共基礎部分佔全卷的30分。
2、 公共基礎知識有10道選擇題和5道填空題。
C語言程序設計
基本要求
1.熟悉TURBO C集成環境。
2.熟練掌握結構化程序設計的方法,具有良好的程序設計風格。
3.掌握程序設計中簡單的數據結構和演算法。
4.TURBO C的集成環境下,能夠編寫簡單的C程序,並具有基本的糾錯和調試程序的能力。
考試內容
一、C語言的結構
1.程序的構成,MAIN函數和其他函數。
2.頭文件,數據說明,函數的開始和結束標志。
3.源程序的書寫格式
4.C語言的風格。
二、數據類型及其運算(基礎)
1.C的數據類型(基本類型,構造類型,指針類型,空類型)及其定義方法。
2.C運算符的種類、運算優先順序和結合性。
3.不同類型數據間的轉換與運算。
4.C表達式類型(賦值表達式、算術表達式、關系表達式、邏輯表達式、條件表達式、逗號表達式)和求值規則。
三、基本語句(基礎)
1.表達式語句,空語句,復合語句。
2.數據的輸入和輸出,輸入輸出函數的調用。
3.復合語句。
4.GOTO語句和語句標號的使用。(這個了解即可)
四、選擇結構程序設計
1.用if語句實現選擇結構。(基礎)
2.用switch語句實現多分支選擇結構。(筆試有)
3.選擇結構的嵌套。
五、循環結構程序設計 (基礎)
1.for 循環結構。
2.while和do while循環結構。
3.continue語句和break語句。
4.循環的嵌套。(基礎)
六、數組的定義和引用
1.一維數組和多維數組的定義、初始化和引用。
2.字元串與字元數組。
七、函數 (基礎)
1.庫函數的正確調用。
2.函數的定義方法。
3.函數的類型和返回值。
4.形式參數與實在參數,參數值的傳遞。
5.函數的正確調用,嵌套調用,遞歸調用。
6.局部變數和全局變數。
7.變數的存儲類別(自動、靜態、寄存器、外部),變數的作用域和生存期。
8.內部函數與外部函數。
八、編譯預處理 (基礎,筆試有考到宏替換)
1.宏定義:不帶參數的宏定義;帶參數的宏定義。
2.「文件包含」處理。
九、指針 (這個很重要,上機題有這方面的)
1.指針與指針變數的概念,指針與地址運算符。
2.變數、數組、字元串、函數、結構體的指針以及指向變數、數組、字元串、函數、結構體的指針變數。通過指針引用以上各類型數據。
3.用指針作函數參數。
4.返回指針值的指針函數。
5.指針數組,指向指針的指針,MAIN函數的命令行參數。
十、結構體(即「結構」)與共用體(即「聯合」)
1.結構體和共用體類型數據的定義方法和引用方法。
2.用指針和結構體構成鏈表,單向鏈表的建立、輸出、刪除與插入。
十一、位運算
1.位運算符的含義及使用。
2.簡單的位運算。
十二、文件操作(了解,上級題有,只要知道什麼意思就行了)
只要求緩沖文件系統(即高級磁碟I/O系統),對非標准緩沖文件系統(即低級磁碟I/O系統)不要求。
1.文件類型指針(FILE類型指針)。
2.文件的打開與關閉(fopen,fclose)。
3.文件的讀寫(fputc,fgetc,fputs,fgets,fread,frwite,fprintf,fscanf函數),文件的定位(rewind,fseek函數)。
PS:分為筆試和機試兩部份,機試有三道題,一道改錯,一道補充,一道綜合,筆試中有30分公共基礎知識,為數據結構,資料庫,網路和電腦常識方面的問題,有70分選擇題,30分填空題,難點為數組,指針,也為重點
全國計算機等級考試調整方案
關於二級
考試科目:新增二級Delphi語言程序設計,加上原有的二級C等六個科目,二級共七個科目。二級科目分成兩類,一類是語言程序設計(C、C++、Java、Visual Basic、Delphi),另一類是資料庫程序設計(Visual FoxPro、Access)。
考核內容:二級定位為程序員,考核內容包括公共基礎知識和程序設計。所有科目對基礎知識作統一要求,使用統一的公共基礎知識考試大綱和教程。二級公共基礎知識在各科筆試中的分值比重為30%(30分)。程序設計部分的比重為70%(70分),主要考查考生對程序設計語言使用和編程調試等基本能力。
考試形式:二級所有科目的考試仍包括筆試和上機考試兩部分。二級C筆試時間由120分鍾改為90分鍾,上機時間由60分鍾改為90分鍾。所有二級科目的筆試時間統一為90分鍾,上機時間統一為90分鍾。
系統環境:二級各科目上機考試應用軟體為:中文專業版Access 2000、中文專業版Visual Basic 6.0、中文專業版Visual FoxPro 6.0、Visual C++ 6.0,二級C上機應用軟體由Turbo C 2.0改為 Visual C++6.0,二級Java由現在的Java JDK 1.4.2改為專用集成開發環境「NetBeans 中國教育考試版2007」(有關網站將提供免費下載),二級Delphi使用Delphi7.0版本。
⑤ 一個優秀的程序員應該學完哪些計算機理論的知識
1、循環隊列:將隊列存儲空間的最後一個位置繞到第一個位置,形成邏輯上的環狀空間。
2、入隊運算:在循環隊列的隊尾加入一個新元素。上溢:當循環隊列非空,且隊尾指針等於隊頭指針時,說明循環隊列已滿,不能進行入隊運算。
3、退隊運算:在循環隊列的隊頭位置退出一個元素並賦給指定的變數。首先將隊頭指針進一,然後將排頭指針指向的元素賦給指定的變數。下溢:當循環隊列為空時,不能進行退隊運算。
⑥ 程序員分為哪幾類又是以什麼標准做出這個分類的
一種是以語言作為分類 分別有java程序員 .net程序員 php程序員 C/C++程序員等等 有幾種語言就有幾種程序員。
還有以工作類型劃分 前端程序員和後台程序員
還有以平台類型劃分 android程序員和iPhone程序員
⑦ 想考計算機二級c語言,
計算機二級C語言公共基礎知識手冊
1.演算法的時間復雜度是指執行演算法所需要的計算工作量.演算法的工作量由演算法所執行的基本運算次數來度量,而演算法所執行的基本運算次數是問題規模的函數.
2.演算法的空間復雜度是指演算法執行過程中所需要的存儲空間,存儲空間包括演算法程序所佔的空間、輸入的初始數據所佔的存儲空間以及演算法執行過程中所需要的額外空間.
3.一個演算法通常由兩種基本要素組成:一是對數據對象的運算和操作;而是演算法的控制結構.
4演算法設計基本方法主要包括有列舉法、歸納法、遞推、遞歸和減半遞推技術.
5.數據的邏輯結構在計算機存儲空間中的存放形式稱為數據的存儲結構(也稱數據的物理結構).、
6.數據處理是指對數據集合中的各元素以各種方式進行運算,包括插入、刪除、查找、更改等運算,也包括對數據元素進行分析.
7.數據元素是指相互有關聯的數據元素的集合.
8.前驅和後繼關系是數據元素之間的一個基本關系,但前驅個後繼關系所表示的實際意義隨具體對象的不同而不同.一般說來,數據元素之間的任何關系都可以用前驅和後繼關系來描述.
9.常用的存儲結構有順序鏈接、索引等存儲結構.而採用不同的存儲結構,其數據處理的效率是不同的.
10.在數據結構中,沒有前驅的結點稱為根結點;沒有後繼的結點稱為終端結點(葉子結點);數據結構中除了根結點與終端結點外的其他結點一般稱為內部結點.
11.在數據結構中,結點幾結點的相互關系有線性結構和非線性結構.
12.線性結構(線性表):非空數據結構滿足(1)有且只有一個根結點;(2)每個結點最多有一個前驅,也最多有一個後繼.
在一個線性結構中插入或刪除任何一個結點後還應該是線性結構,若刪除或插入後不是線性結構,則該數據結構不能稱為線性結構.
13.線性表是最簡單、最常用的一種數據結構.有一組數據元素組成.在稍微復雜的線性表中,一個數據元素可以由若干個數據項組成,在這種情況下,常把數據元素稱為記錄,含有大量記錄的線性表就稱作文件.
14.非空線性表如與如下結構特徵(1)有且只有一個根結點A1,它無前驅;(2)有且只有一個終端結點AI,它無後繼;(3)除根結點與終端結點外,其他所有結點有且只有一個前驅,也只有一個後繼.線性表中結點的個數N稱為線性表的長度.當N=0時,稱其為空表.
15.在計算機中存放線性表,一種最簡單的方法是順序存儲,也稱順序分配.
16.線性表的順序存儲結構具有以下兩種基本特點:(1)線性表中所有元素所佔的存儲空間是連續的;(2)線性表中各數據元素在存儲空間中是按邏輯順序依次存放的. 在線性表的存儲結構中,其前後繼兩個元素在存儲空間中是緊鄰的,且前驅元素一定存儲在後繼元素的前面.
17.假設線性表中第一個數據元素的存儲地址是ADR(AI),每一個數據元素佔K個位元組,則線性表中第I個元素AI在計算機存儲空間中的存儲地址是ADR(AI)=ADR(A1)+(I-1)K.
18.在棧中,允許插入與刪除的一端叫做棧頂,而不允許插入與刪除的另一端叫做棧底.棧頂元素總是最後被插入的元素,從而也是最先被刪除的元素;棧底元素總是最先被插入的元素,從而也是最後才能被刪除的元素.既棧是按照"先進後出"(FILO.FIRST IN LAST OUT)或"後進先出"(LIFO,LAST IN FIRST OUT).因此,棧也被叫做"先進後出"或"後進先出"表.棧具有記憶作用.
19.棧是一種特殊的線性表.
20.棧的基本運算有三種:入棧(會出現"上溢"錯誤)、退棧(會出現"下溢"錯誤)和讀棧頂元素.
21.隊列是指允許在一端進行插入、在另一端進行刪除的線性表.允許插入的一端叫做隊尾,通常用一個稱為尾指針(REAR)的指針指向隊尾元素.既尾指針總是指向最後被插入的元素;允許刪除的一端稱為排頭(對頭),通常也用一個排頭指針指向排頭元素的前一位置。顯然,最先插入的元素將最先能夠被刪除,最後插入的元素最後才能被刪除。因此,隊列又稱為「先進先出」或「後進後出」的線性表,它體現了「先來先服務」的原則。在隊列中,對尾指針REAR與派頭指針FRONT共同反映了隊列中元素動態變化的情況。
22。往隊列的對尾插入一個元素稱為入隊運算,從隊列的排頭刪除一個元素的運算稱為退隊運算。
23。循環隊列主要有兩種基本運算:入隊運算和退隊運算。每進行一次入隊運算,隊尾指針就進一;每進行一次退隊運算,排頭指針就進一。
24遞歸演算法一般需要利用棧來實現。
25。在鏈式存儲方式中,要求每個結點由兩部分組成:一部分用於存放數據元素值,稱為數據域;另一部分用於存放指針,稱為指針域。其中指針用於指向該結點的前一個或後一個結點(既前驅或後繼)。
26。數據結構作為計算機的一門學科主要討論和研究三方面的問題:數據的邏輯結構;數據的存儲結構;對各種數據進行的運算。
27。數據的邏輯結構在計算機存儲空間中的存放形式稱為數據的存儲結構(物理結構)。線性鏈表屬於存儲結構。
28,在線性單鏈表中,每一個結點只有一個指針域,由這個結點只能找到後繼結點,但不能找到前驅結點,必須從頭指針開始重新尋找。
29。為了彌補線性單鏈的這個缺點,在某些應用中,對線性鏈表中的每個結點設置兩個指針,一個稱為左指針(LLINK),用以指向前驅結點,另一個稱為右指針(RLINK),用以指向後繼結點,這樣的線性鏈表稱為雙向鏈表。
30。棧也是線性表,也可以採用鏈式存儲結構。
在實際應用中,帶鏈的棧可以用來收集計算機存儲空間中所以空閑的存儲結點,這種帶鏈的棧稱為可利用棧。
31。線性鏈表的插入是指在鏈式存儲結構下的線性表中插入一個新元素。
為了要在線性鏈表中插入一個新元素,首先要給該元素分配一個新結點,以便用於存放該元素的值。新結點可以從可利用棧中取得。然後將存放新元素值的結點連接到線性鏈表中指定的位置。
32。在線性鏈表中刪除一個元素後,不需要移動表的數據元素,只須改變被刪除元素所在結點的前一個結點的指針域即可。
33。循環鏈表中設置了一個表頭結點,因此,在任何情況下,循環鏈表中至少有一個結點存在,從而使空表與非空表的統一;
在對循環鏈表進行插入和刪除的過程中,實現了空表與非空表的同意。
34。二叉樹的遍歷可以分三種:前序遍歷,中序遍歷,後序遍歷。
前序遍歷:1,訪問根結點;2,前序遍歷左子樹;3,前序遍歷右子樹;
中序遍歷:1,中序遍歷左子樹;2,訪問根結點;3,中序遍歷右子樹;
後序遍歷:1,後序遍歷左子樹;2。後序遍歷右子樹;3,訪問根結點。
35。滿二叉數:除最後一層外,每一層上的所有結點都有兩個子結點。也就是說,在滿二叉樹中,每一層上的結點數都達到最大值,既在滿二叉樹的第K層上有2的K次方減1個結點,且深度為M的滿二叉樹有2的M次減1個結點。
36。在樹結構中,一個結點所擁有的後繼個數稱為該結點的度。在樹中,所有結點中最大的度稱為樹的度。
37.完全二叉樹是指除最後一層外,每一層上的結點數均達到最大值;在最後一層上只缺少右邊的若干結點。更確切的說,從根結點算起,對二叉樹的結點自上而下、自坐至右用自然數進行連續編號,則深度為M、且有N個結點的二叉樹,當且僅當其每一個結點都與深度為M的滿二叉樹中編號從1到N的結點一一對應,稱為完全二叉樹。
38。滿二叉樹是完全二叉樹,而完全二叉樹一般不是滿二叉樹。
39。如果按從上到下、從左到右順序存儲完全二叉樹的各結點,則很容易確定每一個結點的父結點、左子結點和右子結點的位置。
40。二分法查找只適用與順序存儲的有序表。此有序表指線性表中的元素按值非遞減排列。對於長度為N的有序線性表,在最壞的情況下,二分查找只需要比較LOG下2上N次,而順序查找需要 比較N次。
41,雖然順序查找的效率不高,但有兩種情況必須用該方法:1,線性表為無序表2。採用鏈式存儲結構
42。假設線性表的長度為N,則在最壞情況下,冒泡發需要比較次數為N(N-1)/2,從前往後和從後往前個需要N/2遍的掃描。
43。堆排序的方法對較大規模的線性表來說是很有效的。在最壞情況下,他需比較的次數是O(nlog下2上n)。堆排序時間復雜度最小,
44。隊排序方法如下:1,先將一個無序序列建成堆;2,將堆頂元素(序列中的最大項)與堆中最後一個元素交換(最大項應該在序列的最後)。不考慮已經換到最後的那個元素,只考慮前N-1個元素構成的子序列。顯然,該子序列已不在是堆,但左右子樹仍為堆,可調整為堆,反復,直到剩下的子序列為空為止。
45,快速排序發也是一種互換類的排序方法,比冒泡發速度快,可實現通過一次交換而消除多個逆序。
46,快速排序基本思想如下:從線性表中選取一個元素,設為T,將線性表中小於T的元素移到前面,而前面大於T的數移到後面,結果就將線性表分成兩部分(兩個子表),T插入到其分界線的位置,這個過程稱為線性表的分割。這樣,前面子表中的所有元素均不大於T,後面所以元素均不小於T。若對分割後的各子表在按上述方法進行分割,一直持續下去,直到所以子表為空為止,此時的線性表就變成了有序表。因此,快速排序發的關鍵是對線性表進行分割,並對各分割出的子表進行分割。
47,簡單插入排序法中,每次比較後最多移掉一個呢序。因此,他與冒泡排序法相同,在最壞情況下,需要N(N-1)/2次比較。
48,希爾排序法屬於插入類排序,但他對簡單插入排序作了較大改進。選擇類排序法主要有簡單選擇排序法和堆排序法;交換類排序法主要有,冒泡排序法和快速排序法;插入類排序法主要有簡單插入排序法和希爾排序法。
49,源程序文檔化時應注意考慮:符號名的命名、程序注釋和視覺組織。注釋一般分為序言性注釋和功能性注釋。序言性注釋通常位於每個程序的開頭部分,它給出程序的整體說明,主要描述內容包括:程序標題、程序功能說明、主要演算法、介面說明、程序位置、開發簡歷、程序設計者、復審者、復審日期、修改日期等。 功能性注釋的位置一般嵌在源程序體之中,主要描述其後的語句或程序做什麼。
50,在編寫程序時,開發者需注意數據說明的風格,以便使程序中的數據說明更易於理解個維護。 程序編寫要作到清晰第一,效率第二。
51,當程序設計語言對輸入格式有嚴格要求時,應保持輸入格式與輸入語句的一致性。
52,程序的易讀性是結構話程序設計最重要的特點。
53,按結構化設計方法設計的程序具有以下特點:1,程序易於理解、使用和維護,程序員採用結構化編程方法,便於控制、降低程序的復雜性,因此便於編寫程序。2,提高了編程的效率,降低軟體開發的成本。3,結構化程序設計選用的每個控制結構只允許有一個入口和一個出口,
54,模塊是指執行某一個特定任務(也可以是實現某一特定的抽象數據類型)的數據結構和程序代碼。一個模塊有他的外部特徵和內部特徵。外部特徵包括模塊的介面和模塊的功能;內部特徵包括模塊的局部數據和實現該模塊的程序代碼。調用一個模塊時只需知道它的外部特徵即可。
⑧ 關於c語言排序問題
排 序:
程序員可以使用的基本排序演算法有5種:
·插入排序(insertionsort.)
·交換排序(exchangesOrt)
·選擇排序(selectionsort)
·歸並排序(mergesort)
·分布排序(distributionsort)
為了形象地解釋每種排序演算法是怎樣工作的,讓我們來看一看怎樣用這些方法對桌上一付亂序的牌進行排序。牌既要按花色排序(依次為梅花、方塊、紅桃和黑心),還要按點數排序(從2到A)。
插入排序的過程為:從一堆牌的上面開始拿牌,每次拿一張牌,按排序原則把牌放到手中正確的位置。桌上的牌拿完後,手中的牌也就排好序了。
交換排序的過程為:
(1)先拿兩張牌放到手中。如果左邊的牌要排在右邊的牌的後面,就交換這兩張牌的位置。
(2)然後拿下一張牌,並比較最右邊兩張牌,如果有必要就交換這兩張牌的位置。
(3)重復第(2)步,直到把所有的牌都拿到手中。
(4)如果不再需要交換手中任何兩張牌的位置,就說明牌已經排好序了;否則,把手中的牌放到桌上,重復(1)至(4)步,直到手中的牌排好序。
選擇排序的過程為:在桌上的牌中找出最小的一張牌,拿在手中;重復這種操作,直到把所有牌都拿在手中。
歸並排序的過程為:把桌上的牌分為52堆,每堆為一張牌。因為每堆牌都是有序的(記住,此時每堆中只有一張牌),所以如果把相鄰的兩堆牌合並為一堆,並對每堆牌進行排序,就可以得到26堆已排好序的牌,此時每一堆中有兩張牌。重復這種合並操作,就可以依次得到13堆牌(每一堆中有4張牌),7堆牌(有6堆是8張牌,還有一堆是4張牌),最後將得到52張的一堆牌。
分布排序(也被稱作radix sort,即基數排序)的過程為:先將牌按點數分成13堆,然後將這13堆牌按點數順序疊在一起;再將牌按花色分成4堆,然後將這4堆牌按花色順序疊在一起,牌就排好序了。
在選用排序演算法時,你還需要了解以下幾個術語:
(1)自然的(natural)
如果某種排序演算法對有序的數據排序速度較快(工作量變小),對無序的數據排序速度卻較慢(工作變數大),我們就稱這種排序演算法是自然的。如果數據已接近有序,就需要考慮選用自然的排序演算法。
(2)穩定的(stable)
如果某種排序演算法能保持它認為相等的數據的前後順序,我們就稱這種排序演算法是穩定的。
例如,現有以下名單:
Mary Jones
Mary Smith
Tom Jones
Susie Queue
如果用穩定的排序演算法按姓對上述名單進行排序,那麼在排好序後"Mary Jones」和"Tom Jones」將保持原來的Jr順序,因為它們的姓是相同的。
穩定的排序演算法可按主、次關鍵字對數據進行排序,例如按姓和名排序(換句話說,主要按姓排序,但對姓相同的數據還要按名排序)。在具體實現時,就是先按次關鍵字排序,再按主關鍵字排序。
(3)內部排序(internal sort)和外部排序(external sort)
待排數據全部在內存中的排序方法被稱為內部排序,待排數據在磁碟、磁帶和其它外存中的排序方法被稱為外部排序。
查 找:
和排序演算法一樣,查找(searching)演算法也是計算機科學中研究得最多的問題之一。查找演算法和排序演算法是有聯系的,因為許多查找演算法依賴於要查找的數據集的有序程度。基本的查找演算法有以下4種:
·順序查找(sequential searching)。
·比較查找(comparison searching)
·基數查找(radix searching)
·哈希查找(hashing)
下面仍然以一付亂序的牌為例來描述這些演算法的工作過程。
順序查找的過程為:從第一張開始查看每一張牌,直到找到要找的牌。
比較查找(也被稱作binarysearching,即折半查找)要求牌已經排好序,其過程為:任意抽一張牌,如果這張牌正是要找的牌,則查找過程結束。如果抽出的這張牌比要找的牌大,則在它前面的牌中重復查找操作;反之,則在它後面的牌中重復查找操作,直到找到要找的牌。
基數查找的過程為:先將牌按點數分成13堆,或者按花色分成4堆。然後找出與要找的牌的點數或花色相同的那一堆牌,再在這堆牌中用任意一種查找演算法找到要找的牌。
哈希查找的過程為:
(1)在桌面上留出可以放若干堆牌的空間,並構造一個函數,使其能根據點數和花色將牌映射到特定的堆中(這個函數被稱為hashfunction,即哈希函數)。
(2)根據哈希函數將牌分成若干堆。
(3)根據哈希函數找到要找的牌所在的堆,然後在這一堆牌中找到要找的牌。
例如,可以構造這樣一個哈希函數:
pile=rank+suit
其中,rank是表示牌的點數的一個數值;suit是表示牌的花色的一個數值;pile表示堆值,它將決定一張牌歸入到哪一堆中。如果用1,2,……,13分別表示A,2,…….K,用0,1,2和3分別表示梅花、方塊、紅桃和黑桃,則pile的值將為1,2,……,16,這樣就可以把一付牌分成16堆。
哈希查找雖然看上去有些離譜,但它確實是一種非常實用的查找演算法。各種各樣的程序,從壓縮程序(如Stacker)到磁碟高速緩存程序(如SmartDrive),幾乎都通過這種方法來提高查找速度,
排序或查找的性能:
有關排序和查找的一個主要問題就是速度。這個問題經常被人們忽視,因為與程序的其餘部分相比,排序或查找所花費的時間幾乎可以被忽略。然而,對大多數排序或查找應用來說,你不必一開始就花很多精力去編制一段演算法程序,而應該先在現成的演算法中選用一種最簡單的(見3.1和3.4),當你發現所用的演算法使程序運行很慢時,再換用一種更好的演算法(請參見下文中的介紹)。
下面介紹一種判斷排序或查找演算法的速度的方法。
首先,引入一個演算法的復雜度的概念,它指的是在各種情況(最好的、最差的和平均的)下排序或查找需要完成的操作次數,通過它可以比較不同演算法的性能。
演算法的復雜度與排序或查找所針對的數據集的數據量有關,因此,引入一個基於數據集數據量的表達式來表示演算法的復雜度。
最快的演算法的復雜度O(1),它表示演算法的操作次數與數據量無關。復雜度O(N)(N表示數據集的數據量)表示演算法的操作次數與數據量直接相關。復雜度O(logN)介於上述兩者之間,它表示演算法的操作次數與數據量的對數有關。復雜度為O(NlogN)(N乘以logN)的演算法比復雜度為O(N)的演算法要慢,而復雜度為O(N2)的演算法更慢。
注意:如果兩種演算法的復雜度都是O(logN),那麼logN的基數較大的演算法的速度要快些,在本章的例子中,logN的基數均為10
⑨ NCRE C++二級考試要考公共基礎知識
要的,公共基礎部分是編程語言所共有的,也就是數據結構了 二級公共基礎知識總結
第一章 數據結構與演算法
1.1 演算法
演算法:是指解題方案的准確而完整的描述。
演算法不等於程序,也不等計算機方法,程序的編制不可能優於演算法的設計。
演算法的基本特徵:是一組嚴謹地定義運算順序的規則,每一個規則都是有效的,是明確的,此順序將在有限的次數下終止。特徵包括:
(1)可行性;
(2)確定性,演算法中每一步驟都必須有明確定義,不充許有模稜兩可的解釋,不允許有多義性;
(3)有窮性,演算法必須能在有限的時間內做完,即能在執行有限個步驟後終止,包括合理的執行時間的含義;
(4)擁有足夠的情報。
演算法的基本要素:一是對數據對象的運算和操作;二是演算法的控制結構。
指令系統:一個計算機系統能執行的所有指令的集合。
基本運算包括:算術運算、邏輯運算、關系運算、數據傳輸。
演算法的控制結構:順序結構、選擇結構、循環結構。
演算法基本設計方法:列舉法、歸納法、遞推、遞歸、減斗遞推技術、回溯法。
演算法復雜度:演算法時間復雜度和演算法空間復雜度。
演算法時間復雜度是指執行演算法所需要的計算工作量。
演算法空間復雜度是指執行這個演算法所需要的內存空間。
1.2 數據結構的基本基本概念
數據結構研究的三個方面:
(1)數據集合中各數據元素之間所固有的邏輯關系,即數據的邏輯結構;
(2)在對數據進行處理時,各數據元素在計算機中的存儲關系,即數據的存儲結構;
(3)對各種數據結構進行的運算。
數據結構是指相互有關聯的數據元素的集合。
數據的邏輯結構包含:
(1)表示數據元素的信息;
(2)表示各數據元素之間的前後件關系。
數據的存儲結構有順序、鏈接、索引等。
線性結構條件:
(1)有且只有一個根結點;
(2)每一個結點最多有一個前件,也最多有一個後件。
非線性結構:不滿足線性結構條件的數據結構。
1.3 線性表及其順序存儲結構
線性表是由一組數據元素構成,數據元素的位置只取決於自己的序號,元素之間的相對位置是線性的。
在復雜線性表中,由若干項數據元素組成的數據元素稱為記錄,而由多個記錄構成的線性表又稱為文件。
非空線性表的結構特徵:
(1)且只有一個根結點a1,它無前件;
(2)有且只有一個終端結點an,它無後件;
(3)除根結點與終端結點外,其他所有結點有且只有一個前件,也有且只有一個後件。結點個數n稱為線性表的長度,當n=0時,稱為空表。
線性表的順序存儲結構具有以下兩個基本特點:
(1)線性表中所有元素的所佔的存儲空間是連續的;
(2)線性表中各數據元素在存儲空間中是按邏輯順序依次存放的。
ai的存儲地址為:ADR(ai)=ADR(a1)+(i-1)k,,ADR(a1)為第一個元素的地址,k代表每個元素占的位元組數。
順序表的運算:插入、刪除。
1.4 棧和隊列
棧是限定在一端進行插入與刪除的線性表,允許插入與刪除的一端稱為棧頂,不允許插入與刪除的另一端稱為棧底。
棧按照「先進後出」(FILO)或「後進先出」(LIFO)組織數據,棧具有記憶作用。用top表示棧頂位置,用bottom表示棧底。
棧的基本運算:(1)插入元素稱為入棧運算;(2)刪除元素稱為退棧運算;(3)讀棧頂元素是將棧頂元素賦給一個指定的變數,此時指針無變化。
隊列是指允許在一端(隊尾)進入插入,而在另一端(隊頭)進行刪除的線性表。Rear指針指向隊尾,front指針指向隊頭。
隊列是「先進行出」(FIFO)或「後進後出」(LILO)的線性表。
隊列運算包括(1)入隊運算:從隊尾插入一個元素;(2)退隊運算:從隊頭刪除一個元素。
循環隊列:s=0表示隊列空,s=1且front=rear表示隊列滿
1.5 線性鏈表
數據結構中的每一個結點對應於一個存儲單元,這種存儲單元稱為存儲結點,簡稱結點。
結點由兩部分組成:(1)用於存儲數據元素值,稱為數據域;(2)用於存放指針,稱為指針域,用於指向前一個或後一個結點。
在鏈式存儲結構中,存儲數據結構的存儲空間可以不連續,各數據結點的存儲順序與數據元素之間的邏輯關系可以不一致,而數據元素之間的邏輯關系是由指針域來確定的。
鏈式存儲方式即可用於表示線性結構,也可用於表示非線性結構。
線性鏈表,HEAD稱為頭指針,HEAD=NULL(或0)稱為空表,如果是兩指針:左指針(Llink)指向前件結點,右指針(Rlink)指向後件結點。
線性鏈表的基本運算:查找、插入、刪除。
1.6 樹與二叉樹
樹是一種簡單的非線性結構,所有元素之間具有明顯的層次特性。
在樹結構中,每一個結點只有一個前件,稱為父結點,沒有前件的結點只有一個,稱為樹的根結點,簡稱樹的根。每一個結點可以有多個後件,稱為該結點的子結點。沒有後件的結點稱為葉子結點。
在樹結構中,一個結點所擁有的後件的個數稱為該結點的度,所有結點中最大的度稱為樹的度。樹的最大層次稱為樹的深度。
二叉樹的特點:(1)非空二叉樹只有一個根結點;(2)每一個結點最多有兩棵子樹,且分別稱為該結點的左子樹與右子樹。
二叉樹的基本性質:
(1)在二叉樹的第k層上,最多有2k-1(k≥1)個結點;
(2)深度為m的二叉樹最多有2m-1個結點;
(3)度為0的結點(即葉子結點)總是比度為2的結點多一個;
(4)具有n個結點的二叉樹,其深度至少為[log2n]+1,其中[log2n]表示取log2n的整數部分;
(5)具有n個結點的完全二叉樹的深度為[log2n]+1;
(6)設完全二叉樹共有n個結點。如果從根結點開始,按層序(每一層從左到右)用自然數1,2,….n給結點進行編號(k=1,2….n),有以下結論:
①若k=1,則該結點為根結點,它沒有父結點;若k>1,則該結點的父結點編號為INT(k/2);
②若2k≤n,則編號為k的結點的左子結點編號為2k;否則該結點無左子結點(也無右子結點);
③若2k+1≤n,則編號為k的結點的右子結點編號為2k+1;否則該結點無右子結點。
滿二叉樹是指除最後一層外,每一層上的所有結點有兩個子結點,則k層上有2k-1個結點深度為m的滿二叉樹有2m-1個結點。
完全二叉樹是指除最後一層外,每一層上的結點數均達到最大值,在最後一層上只缺少右邊的若干結點。
二叉樹存儲結構採用鏈式存儲結構,對於滿二叉樹與完全二叉樹可以按層序進行順序存儲。
二叉樹的遍歷:
(1)前序遍歷(DLR),首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹;
(2)中序遍歷(LDR),首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹;
(3)後序遍歷(LRD)首先遍歷左子樹,然後訪問遍歷右子樹,最後訪問根結點。
1.7 查找技術
順序查找的使用情況:
(1)線性表為無序表;
(2)表採用鏈式存儲結構。
二分法查找只適用於順序存儲的有序表,對於長度為n的有序線性表,最壞情況只需比較log2n次。
1.8 排序技術
排序是指將一個無序序列整理成按值非遞減順序排列的有序序列。
交換類排序法:(1)冒泡排序法,需要比較的次數為n(n-1)/2; (2)快速排序法。
插入類排序法:(1)簡單插入排序法,最壞情況需要n(n-1)/2次比較;(2)希爾排序法,最壞情況需要O(n1.5)次比較。
選擇類排序法:(1)簡單選擇排序法, 最壞情況需要n(n-1)/2次比較;(2)堆排序法,最壞情況需要O(nlog2n)次比較。