C語言資料結構中的幾種內部排序法,求解!高手速度來指導我

時間 2022-04-09 09:25:11

1樓:匿名使用者

1.shell排序(shellsort)

shell排序通過將資料分成不同的組,先對每一組進行排序,然後再對所有的元素進行一次插入排序,以減少資料交換和移動的次數。平均效率是o(nlogn)。其中分組的合理性會對演算法產生重要的影響。

現在多用d.e.knuth的分組方法。

shell排序比氣泡排序快5倍,比插入排序大致快2倍。shell排序比起quicksort,mergesort,heapsort慢很多。但是它相對比較簡單,它適合於資料量在5000以下並且速度並不是特別重要的場合。

它對於資料量較小的數列重複排序是非常好的。

2.快速排序(quicksort)

快速排序是一個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。

(1) 如果不多於1個資料,直接返回。

(2) 一般選擇序列最左邊的值作為支點資料。

(3) 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。

(4) 對兩邊利用遞迴排序數列。

快速排序比大部分排序演算法都要快。儘管我們可以在某些特殊的情況下寫出比快速排序快的演算法,但是就通常情況而言,沒有比它更快的了。快速排序是遞迴的,對於記憶體非常有限的機器來說,它不是一個好的選擇。

3堆排序(heapsort)

堆排序適合於資料量非常大的場合(百萬資料)。

堆排序不需要大量的遞迴或者多維的暫存陣列。這對於資料量非常巨大的序列是合適的。比如超過數百萬條記錄,因為快速排序,歸併排序都使用遞迴來設計演算法,在資料量非常大的時候,可能會發生堆疊溢位錯誤。

堆排序會將所有的資料建成一個堆,最大的資料在堆頂,然後將堆頂資料和序列的最後一個資料交換。接下來再次重建堆,交換資料,依次下去,就可以排序所有的資料。

下面是一個總的**(這張表很重要),大致總結了我們常見的所有的排序演算法的特點。

排序法 平均時間 最差情形 穩定度 額外空間 備註

冒泡 o(n2) o(n2) 穩定 o(1) n小時較好

交換 o(n2) o(n2) 不穩定 o(1) n小時較好

選擇 o(n2) o(n2) 不穩定 o(1) n小時較好

插入 o(n2) o(n2) 穩定 o(1) 大部分已排序時較好

基數 o(logrb) o(logrb) 穩定 o(n)

b是真數(0-9),

r是基數(個十百)

shell o(nlogn) o(ns) 1

快速 o(nlogn) o(n2) 不穩定 o(nlogn) n大時較好

歸併 o(nlogn) o(nlogn) 穩定 o(1) n大時較好

堆 o(nlogn) o(nlogn) 不穩定 o(1) n大時較好

備註:o(n2)表示雙重迴圈,即n^2

2樓:甫訪波

以前的實驗題。

#define ok 1

#define null 0

#define error 2

#define elemtype int

#include "iostream.h"

#include "stdio.h"

#include "stdlib.h"

typedef struct lnode

lnode,*linklist;

linklist createlist_l(linklist l, int n)

//建立單連結串列

return l;

}int print( linklist l) //輸出連結串列

}else

cout<<"連結串列沒有資料"

j=0;

while(p!=null)

return j;

}int cleatlist_l(linklist l) //清空連結串列元素

cout<<"資料已清空"

} //尋找第i-1個結點

if (!p||j > i-1)

return error; // i 大於表長或者小於1

s=(linklist)malloc(sizeof(lnode));

s->data = e;

s->next = p->next; // 插入l中

p->next = s;

return ok;

在帶頭結點的單連結串列線性表l中,刪除第i個元素,並由e返回其值

是帶頭結點的連結串列的頭指標

//當第i個元素存在時,其值賦給e並返回ok,否則返回error

if(!p||j>i)return error; // 第 i 個元素不存在

e=p->data;// 取得第 i 個元素

return e;

}void showmenu()}

資料結構中幾種常見內部排序方法的比較

3樓:百度文庫精選

內容來自使用者:cngdzjl

資料結構各種排序方法的綜合比較

結論:  排序方法 平均時間  最壞時間     輔助儲存  簡單排序 o(n2)        o(n2)         o(1)  快速排序 o(nlogn)    o(n2)        o(logn)  堆排序 o(nlogn)       o(nlogn)     o(1)  歸併排序 o(nlogn)     o(nlogn)     o(n)  基數排序 o(d(n+rd))  o(d(n+rd))  o(rd)ps:直接插入排序、氣泡排序為簡單排序,希爾排序、堆排序、快速排序為不穩定排序

一、時間效能

按平均的時間效能來分,有三類排序方法:時間複雜度為o(nlogn)的方法有:快速排序、堆排序和歸併排序,其中以快速排序為最好;

時間複雜度為o(n2)的有:直接插入排序、起泡排序和簡單選擇排序,其中以直接插入為

最好,特別是對那些對關鍵字近似有序的記錄序列尤為如此;

時間複雜度為o(n)的排序方法只有,基數排序。

當待排記錄序列按關鍵字順序有序時,直接插入排序和起泡排序能達到o(n)的時間複雜度;而對於快速排序而言,這是最不好的情況,此時的時間效能蛻化為o(n2),因此是應該儘量避免的情況。簡單選擇排序、堆排序和歸併排序的時間效能不隨記錄序列中關鍵字的分佈而改變。二、空間效能

指的是排序過程中所需的輔助空間大小。

1.所有的簡單排序方法(包括:直接插入、起泡和簡單選擇3....

4樓:張幾何

這些全是內排,有什麼問題你再問我

c語言資料結構中串和陣列的三個問題!!高手速來!急!!**等!

5樓:匿名使用者

第一題 結果為 m*(n-m+1) 比如 子串 001 主串 0001 這就是最壞情況

第二題 第一問 求a[5][7] 由a[0][0]=1000(地址); a[0][1]=1006(因為6個位元組) ;所以對於a[5][7]可以用(5*8+7)*6+1000=1282;或者直接用1000+(6*8-1)*6=1282;同理a[1][4]用(1*8+4)*6+1000=1072;

第三題 由題a[1][1]=2048(地址) 因為按列儲存 所以a[32][58] 就為

((58-1)*60+32-1)*2+2048=9050; 其實可以把二維陣列相像成想x-y座標系 把求地址相像成求數列;即an=a1+(n-1)*d;

6樓:匿名使用者

在a[7[[6]前面共有a[0]到a[6] 七行,每行的下三角元素個數分別為1,2,3,4,5,6,7,加起來共28個。然後第a[7]行中,a[7][6]前面又有a[7][0]到a[7][5]共6個元素,所以,以行為主序時,a[7][6]前面要儲存的元素共有28+6=34個,

所以a[7][6]的地址為:&a[7][6]=2000+34*3=2012

急!!高手請進!c語言中資料結構與演算法是用來幹嘛的?

7樓:匿名使用者

那裡來這麼多問題- -

語言和語言之間的差別,就是一個問題的解決方法的差別如果真的把演算法弄明白了,就像張口說普通話一樣簡單能有怎麼多奇怪的問題,只能說

一、你對資料結構演算法理解不夠透徹、熟練

二、你對你所要操作的語言還沒有完全瞭解

8樓:匿名使用者

演算法中的**一般都是偽**,,告訴你的是一種思想, 複製過來肯定不能直接使用,,你可以稍微的改改 ,編譯一下,便可執行,得到你想要的結果,不是很難。 偽**中一般不怎麼宣告,拿來直接用 ,你用的時候給他加上相應的型別即可,,,,, 至於一些函式,,例如,棧中的pop() push() 這些函式需要你自己寫,,但也可以不自己寫,標準庫中有對棧這種資料結構做了定義,,對棧常用的動作也寫了很多常用的函式 例如pop push,, 你可以直接拿來用 用之前 ,引入一些標頭檔案即可 ,,, 你可以看下 c++prime 這麼書 第8章 以後 我也忘記具體章節 上面寫的很清楚 ,, 當然 譚浩強大哥 的c++ 書 很基礎,,這些東西都沒有講到,, 專業人士 還是要學透 c++ prime thinking in c++ 這樣的高階書

9樓:匿名使用者

你問得太高深了!!!

10樓:匿名使用者

基本一樣,建議好好看看c語言資料結構

資料結構c語言版和j**a版有什麼不同

如何學習c語言

11樓:卯永芬次凰

學習c語言的方法很多,最有效的莫過於

學習心態以及學習的順序!

心態要端正,遇到問題別懷疑自己的大腦和能力,我敢保證只要你沒有智障,任何語言對你來說絕對不是問題!

學習順序非常重要,比方說你不能在不學習普通型別變數的操作下去學習陣列……我建議你好好把基礎大好,還有一個就是

c語言在執行的過程中

他的底層是如何實現的,這個很重要,

如果你按照我說的學習,c語言對你來說

很容易!

12樓:呼新蘭騎丙

嘿嘿,你跟我有那麼一比

當初我也是成績相當不好

但是隻要感興趣,絕對是學得好的。

有人說學c++之前一定要學c。

這倒不一定

但是如果直接學c++的話

之後最好再看看c

瞭解一下也是有好處的,

c++primer

是本好書

注意不是primer

plus

這本我沒看過

甚至你可以隨便先找本爛書看

如果你屬於很好問的人的話

你一定會有很多問題

然後再看c++primer

那樣效果會很好的

另外,多上論壇

不懂問就是

積累了一定的知識之後可以試著幫著回答別人的一些問題這樣可以加強自己對語言的理解。

有一點不同意樓上的說法

c語言是基礎,但他絕不簡單

簡單的知識語法而已

而你知道語法有什麼用呢?

就好比你知道中文的語法

你就能寫出漂亮的詩歌嗎?

答案是否定的……

語法並不太必要刻意熟記,

用多了自然就記得了

思考演算法、結構

最重要的是程式設計思想。

「物件導向」不是說說而已

如果沒理解清楚那寫出來的東西說不定就是四不象。

但是不必害怕,

雖然不簡單,但也不是難以入門。

具體的在你學的過程中是能夠慢慢體會到的。

資料結構快速排序問題,C語言資料結構 快速排序的問題

由於你傳遞的l是值傳遞,在快速排序內部出現了一個名字一樣的區域性變數,只是區域性變數被排序了,並不是傳入的變數被排序,可以採用傳地址的方式解決,或者不定義形參,直接採用全域性變數。我使用前者幫你實現了 再者,快速排序 有點問題,幫你修改了下 include include define maxsiz...

C語言資料結構,C語言 資料結構

include include defineinfinity0 definemax vertex num10 最大頂點數 definemax edge num40 最大邊數typedefenumgraphkind typedefcharvertextype 頂點資料型別typedefstructar...

資料結構中的排序問題,急,資料結構 排序問題

排序方法小結 方法比較。綜合比較各種內部排序方法,其效能如下入所示 方法 平均時間 最壞情況 輔助空間 穩定性 特點。插入排序 o n2 o n2 o 1 n 30常用。希爾排序 o o o 1 不常用。起泡排序 o n2 o n2 o 1 初學。快速排序 o nlnn o n2 o n 常用,易惡...