求解答 在插入排序 快速排序和堆排序中,若關鍵字基本有序,應選擇哪種方法?若只從排序結婚的穩定性考

2021-03-26 12:22:36 字數 5789 閱讀 7983

1樓:聽不清啊

在插入排序、快速排序和堆排序中,若關鍵字基本有序,應選擇插入排序。極限情況,若關鍵字已經全部有序,則插入排序只要比較n-1次,而堆排序的比較次數明顯會更多。

若只從排序結果的穩定性考慮,應選擇插入排序。因為在上述三種排序方法中,只有插入排序是穩定的排序。

18.在直接插入和簡單選擇排序中,若初始資料基本有序,則選用 排序演算法。

2樓:聽不清啊

在直接插入和簡單選擇排序中,若初始資料基本有序,則選用(直接插入) 排序演算法

選擇排序,快速排序,氣泡排序,堆排序,插入排序,基排序的程式的執行速度

3樓:匿名使用者

分析如下:62616964757a686964616fe59b9ee7ad9431333262383566

氣泡排序:在最優情況下只需要經過n-1次比較即可得出結果,(這個最優情況那就是序列己是正序,從100k的正序結果可以看出結果正是如此),但在最壞情況下,即倒序(或一個較小值在最後),下沉演算法將需要n(n-1)/2次比較。所以一般情況下,特別是在逆序時,它很不理想。

它是對資料有序性非常敏感的排序演算法。

氣泡排序2:它是氣泡排序的改良(一次下沉再一次上浮),最優情況和最壞情況與氣泡排序差不多,但是一般情況下它要好過氣泡排序,它一次下沉,再一次上浮,這樣避免了因一個數的逆序,而造成巨大的比較。如(2,3,4,…,n-1,n,1),用氣泡排序需要n(n-1)/2次比較,而此排序只要3輪,共比較(n-1)+(n-2)+(n-3)次,第一輪1將上移一位,第二輪1將移到首位,第三輪將發現無資料交換,序列有序而結束。

但它同樣是一個對資料有序性非常敏感的排序演算法,只適合於資料基本有序的排序。

快速排序:它同樣是氣泡排序的改進,它通過一次交換能消除多個逆序,這樣可以減少逆序時所消耗的掃描和資料交換次數。在最優情況下,它的排序時間複雜度為o(nlog2n)。

即每次劃分序列時,能均勻分成兩個子串。但最差情況下它的時間複雜度將是o(n^2)。即每次劃分子串時,一串為空,另一串為m-1(程式中的100k正序和逆序就正是這樣,如果程式中採用每次取序列中部資料作為劃分點,那將在正序和逆時達到最優)。

從100k中正序的結果上看「快速排序」會比「氣泡排序」更慢,這主要是「氣泡排序」中採用了提前結束排序的方法。有的書上這解釋「快速排序」,在理論上講,如果每次能均勻劃分序列,它將是最快的排序演算法,因此稱它作快速排序。雖然很難均勻劃分序列,但就平均效能而言,它仍是基於關鍵字比較的內部排序演算法中速度最快者。

直接選擇排序:簡單的選擇排序,它的比較次數一定:n(n-1)/2。

也因此無論在序列何種情況下,它都不會有優秀的表現(從上100k的正序和反序資料可以發現它耗時相差不多,相差的只是資料移動時間),可見對資料的有序性不敏感。它雖然比較次數多,但它的資料交換量卻很少。所以我們將發現它在一般情況下將快於氣泡排序。

堆排序:由於它在直接選擇排序的基礎上利用了比較結果形成。效率提高很大。

它完成排序的總比較次數為o(nlog2n)。它是對資料的有序性不敏感的一種演算法。但堆排序將需要做兩個步驟:

-是建堆,二是排序(調整堆)。所以一般在小規模的序列中不合適,但對於較大的序列,將表現出優越的效能。

直接插入排序:簡單的插入排序,每次比較後最多移掉一個逆序,因此與氣泡排序的效率相同。但它在速度上還是要高點,這是因為在氣泡排序下是進行值交換,而在插入排序下是值移動,所以直接插入排序將要優於氣泡排序。

直接插入法也是一種對資料的有序性非常敏感的一種演算法。在有序情況下只需要經過n-1次比較,在最壞情況下,將需要n(n-1)/2次比較。

希爾排序:增量的選擇將影響希爾排序的效率。但是無論怎樣選擇增量,最後一定要使增量為1,進行一次直接插入排序。

但它相對於直接插入排序,由於在子表中每進行一次比較,就可能移去整個經性表中的多個逆序,從而改善了整個排序效能。希爾排序算是一種基於插入排序的演算法,所以對資料有序敏感。

歸併排序:歸併排序是一種非就地排序,將需要與待排序序列一樣多的輔助空間。在使用它對兩個己有序的序列歸併,將有無比的優勢。

其時間複雜度無論是在最好情況下還是在最壞情況下均是o(nlog2n)。對資料的有序性不敏感。若資料節點資料量大,那將不適合。

但可改造成索引操作,效果將非常出色。

基數排序:在程式中採用的是以數值的十進位制位分解,然後對空間採用一次性分配,因此它需要較多的輔助空間(10*n+10), (但我們可以進行其它分解,如以一個位元組分解,空間採用連結串列將只需輔助空間n+256)。基數排序的時間是線性的(即o(n))。

由此可見,基數排序非常吸引人,但它也不是就地排序,若節點資料量大時宜改為索引排序。但基數排序有個前提,要關鍵字能象整型、字串這樣能分解,若是浮點型那就不行了。

按平均時間將排序分為類:

(1) 平方階(o(n2))排序

各類簡單排序,例如直接插入、直接選擇和氣泡排序;

(2) 線性對數階(o(nlog2n))排序

如快速排序、堆排序和歸併排序;

(3) o(n1+§))排序

§是介於0和1之間的常數。希爾排序便是一種;

(4) 線性階(o(n))排序

本程式中的基數排序,此外還有桶、箱排序。

排序方法的選擇

因為不同的排序方法適應不同的應用環境和要求,所以選擇合適的排序方法很重要

(1)若n較小,可採用直接插入或直接選擇排序。

當記錄規模較小時,直接插入排序較好,它會比選擇更少的比較次數;

但當記錄規模較大時,因為直接選擇移動的記錄數少於直接插人,所以宜用選直接選擇排序。

這兩種都是穩定排序演算法。

(2)若檔案初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜(這裡的隨機是指基準取值的隨機,原因見上的快速排序分析);這裡快速排序演算法將不穩定。

(3)若n較大,則應採用時間複雜度為o(nlog2n)的排序方法:快速排序、堆排序或歸併排序序。

快速排序是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分佈時,快速排序的平均時間最短;

堆排序雖不會出現快速排序可能出現的最壞情況。但它需要建堆的過程。這兩種排序都是不穩定的。

歸併排序是穩定的排序演算法,但它有一定數量的資料移動,所以我們可能過與插入排序組合,先獲得一定長度的序列,然後再合併,在效率上將有所提高。

(4)特殊的箱排序、基數排序

它們都是一種穩定的排序演算法,但有一定的侷限性:

1、關鍵字可分解。

2、記錄的關鍵字位數較少,如果密集更好

3、如果是數字時,最好是無符號的,否則將增加相應的對映複雜度,可先將其正負分開排序。

事實上各種排序方法個有優缺點適用於不同的場合:

排序(sorting)

插入排序(insertion sort):直接插入排序 希爾排序(shell's sort)(縮小增量排序diminishing increment sort)

交換排序:氣泡排序(bubble sort)快速排序(quick sort)

選擇排序:直接選擇排序(straight selection sort),堆排序;

歸併排序(merge sort):

分配排序:箱排序(bin sort),基數排序(radix sort)

更多的自己研究一下。

排序方法的選取主要考慮演算法的效能與資源佔用。也就是速度和佔用的儲存空間。

希望對你有所幫助!

4樓:

要看時間複雜度羅。

o(n^2),o(n^2),o(n^2),o(nlog 2 n),o(nlog 2 n),o(nlog 2 n),

在插入和選擇排序中,初始資料基本正序則選用 ? 初始資料基本反序則選用? 10

5樓:

a。(在堆排

序和快速排序中,若原始記錄接近正序或反序,則選用專_堆排序____,若原始記錄無序,屬則最好選用__快速排序___。)

c錯了。c的原題是下列排序法中,時間複雜度不收資料初始狀態影響,總是為o(n2)的是__直接選擇排序 ____。

和。表示式:i=i+iir分流原理:

6樓:匿名使用者

perform tai chi

插入排序,選擇排序,快速排序,歸併排序的原理都是是什麼?哪個要求記憶體量最大?

7樓:天使惡魔

是計算機內經常進行的一種操作,其目的是將一組「無序」的記錄序列調整為「有序」的記錄序列。

內部排序和外部排序:

若整個排序過程不需要訪問外存便能完成,則稱此類排序問題為內部排序;

反之,若參加排序的記錄數量很大,整個序列的排序過程不可能在記憶體中完成,則稱此類排序問題為外部排序。

內部排序的過程是一個逐步擴大記錄的有序序列長度的過程。

內排序的方法有許多種,按所用策略不同,可歸納為五類:插入排序、選擇排序、交換排序、歸併排序和分配排序。

其中,插入排序主要包括直接插入排序和希爾排序兩種;選擇排序主要包括直接選擇排序和堆排序;交換排序主要包括氣(冒)泡排序和快速排序。

一、氣泡排序

已知一組無序資料a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[2]與a[3]的值,若a[2]大於a[3]則交換兩者的值,否則不變。

再比較a[3]與a[4],以此類推,最後比較a[n-1]與a[n]的值。這樣處理一輪後,a[n]的值一定是這組資料中最大的。再對a[1]~a[n-1]以相同方法處理一輪,則a[n-1]的值一定是a[1]~a[n-1]中最大的。

再對a[1]~a[n-2]以相同方法處理一輪,以此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。

優點:穩定,比較次數已知;

缺點:慢,每次只能移動相鄰兩個資料,移動資料的次數多。

二、選擇排序

已知一組無序資料a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[1]與a[3]的值,若a[1]大於a[3]則交換兩者的值,否則不變。

再比較a[1]與a[4],以此類推,最後比較a[1]與a[n]的值。這樣處理一輪後,a[1]的值一定是這組資料中最小的。再將a[2]與a[3]~a[n]以相同方法比較一輪,則a[2]的值一定是a[2]~a[n]中最小的。

再將a[3]與a[4]~a[n]以相同方法比較一輪,以此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。

優點:穩定,比較次數與氣泡排序一樣;

缺點:相對之下還是慢。

三、插入排序

已知一組升序排列資料a[1]、a[2]、……a[n],一組無序資料b[1]、b[2]、……b[m],需將二者合併成一個升序數列。首先比較b[1]與a[1]的值,若b[1]大於a[1],則跳過,比較b[1]與a[2]的值,若b[1]仍然大於a[2],則繼續跳過,直到b[1]小於a陣列中某一資料a[x],則將a[x]~a[n]分別向後移動一位,將b[1]插入到原來a[x]的位置這就完成了b[1]的插入。b[2]~b[m]用相同方法插入。

(若無陣列a,可將b[1]當作n=1的陣列a)

優點:穩定,快;

缺點:比較次數不一定,比較次數越少,插入點後的資料移動越多,特別是當資料總量龐大的時候,但用連結串列可以解決這個問題。

四、縮小增量排序

由希爾在2023年提出,又稱希爾排序(shell排序)。

已知一組無序資料a[1]、a[2]、……a[n],需將其按升序排列。發現當n不大時,插入排序的效果很好。首先取一增量d(d=a[1]、a[2]、……a[n],接著迴圈n次,每次x[a]++.

優點:快,效率達到o(1)

缺點:資料範圍必須為正整數並且比較小

二分法插入排序快速排序歸併排序堆排序的時間複雜度分別

二分法插入排序 複雜度 o nlogn 快速排序 o nlogn 有可能退化歸併排序 o nlogn 比較快 堆排序 o nlogn 最穩定的 排序演算法 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。分類 在電腦科學所使用的排序演算法通常被分類為 計算的複...

c 程式設計用函式實現排序演算法(氣泡排序 插入排序)

include using namespace std template void bubble t arr,int n for i 0 i void insert t arr,int n 插入排序 int i,j,pos t temp for i 0 i include using namespa...

C語言插入排序怎麼編

一般來說,插入排序都採用in place在陣列上實現。具體演算法描述如下 1.從第一個元素開始,該元素可以認為已經被排序 2.取出下一個元素,在已經排序的元素序列中從後向前掃描 3.如果該元素 已排序 大於新元素,將該元素移到下一位置 4.重複步驟3,直到找到已排序的元素小於或者等於新元素的位置 5...