演算法 第二章排序

2021-10-03 15:53:00 字數 2771 閱讀 8642

##目錄

初級排序

選擇排序

插入排序

希爾排序

歸併排序

自頂向下排序

自底向上排序

快速排序

優先佇列

##初級排序 ###一、 選擇排序

簡述:選擇排序就是遍歷一遍陣列把最小的和第乙個數字交換。第二遍遍歷陣列時候選擇和第二個交換,一次類推。

//注意不要在for迴圈中用a.length()不然每次都要獲取a.length();

public voiv sort(comparable a)

//int tmp = a[i];

//a[i] = a[min];

//a[min] = tmp;

exch(a,j,min);

} }}

public void sort(comparable a) 

// }

//}for(int i=1,i0&&less(a[j],a[j-1]);j--)

}}

命題c

插入排序的比較次數 大於等於倒置的數量,小於等於倒置數量加上陣列大小再減一。

最壞就是全倒置嘛,這時候每倒置一次就要多比一次,然而陣列裡每個數都要比較,除了第乙個數時候和自身不比較,所以是 最差等於倒置數量+陣列大小-1。

所以對 部分有序的陣列十分高效,也適合小規模陣列。

當不考慮交換和比較成本,兩個差不多,但是感覺陣列規模小的化插入有優勢,規模大的化選擇有優勢。【平均而言】

public static void sort(comparable a)

int i = lo;

int j = mid + 1;

for(int k=0;kmid) a[k] = auk[j++];

else if(j>=hi) a[k] = auk[i++];

else if(less(aux[j],aux[i])) a[k] = auk[i++];

else a[k] = auk[i++];

}}

接下來是使用到原地歸併的兩個歸併方法,使用思想不一樣,但是我覺得本質都一樣。

我測試了 兩個排序50個100萬完全隨機資料,花的時間都差不多。

前者說是自頂向下,其實也是下到兩兩元素才開始正式比對。

自頂向下的歸併排序 分治思想

private static comparable aux;

public static void sort(comparable a)

public static void sort(comparable a,int lo ,int hi)

因為插入排序適合小陣列,據說是 歸併 + 插入 賽高。還沒有驗證。

自底向上的歸併排序

private static compararble aux;

public static void sort(comparable a)

}}

最後的幾個結論不是很懂,只能二刷時候再看了。

快速排序也是把問題分開再分開,不同的是它並不是平均分成兩組,而是產生乙個分開因子。籠統而言和歸併差不多吧,但是我測試速度感覺比歸併快一點。時間能達到1/2甚至更多

public static void sort(comparable a)

public static void sort(comparable a,int lo,int hi)

//core code

public static void partition(comparable a, int lo,int hi)/*if(j==lo) break;*/

if(i>=j) break;

exch(a,i,j);

} exch(a,j,lo);

return j;

}//quick3way

public static void sort3way(comparable a,int lo,int hi)

//lt-1 都是比v小的

//gt+1 都是比v大的

//剩下的都是等於v的。

sort3way(a,lo,lt-1);

sort3way(a,gt+1,hi);

}

###優先佇列 優先佇列是一種思想,只能說堆排序用了這種思想。 大概就是當乙個完全二叉樹時候,對於乙個節點k(從 1 開始的序號), 他的父節點為k/2 左子節點為 2k 右子節點為 2k + 1 下面的節點總比上面的節點大(根據實際用途,自己要求) 我們可以通過遍歷某個節點的 當我們新增乙個方法的時候 可以先將插入物件新增到隊尾 可以使用 swim方法,讓其上浮 ####由下至上的對有序化(上浮) ``` //注意我們這裡假設陣列從 index 1 開始 public void swim(comparable a,int k) } //這樣直接上浮到適合的位置為止。 } ``` 書上介紹優先佇列用法,就是用來快速刪除最大(最小【需另設佇列】)元素的。

當我們刪除最大節點,先使他下沉,使他子元素補位,

由上至下的堆有序化,下沉

//注意我們這裡假設陣列從 index 1 開始

public void sink(comparable a,int k,int n)

while(n>1)

}public static void sink(comparable a,int k,int n)

}

演算法第二章 快速排序

先把快速排序的 實現貼上來,太晚了,過程改天再加上!快速排序就是把乙個數拿出來,然後把小於這個數的扔到一邊,把大於它的扔到一邊,那這個數就在正確的位置上了 然後把這個數的左邊分成乙份,右邊分成乙份,再把這兩份進行剛才的做法,一直不停地這樣做,直到不能再分。接下來就要說明怎麼把小於它的數扔到一邊,大於...

第二章 演算法

本章內容了解即可。如果大家對資料結構完全不了解,我建議你先去看一下b站上郝斌老師的課程。演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的優先序列,並且每條指令表示乙個或多個操作。只聽資料結構課程,當然可以,但是聽完後你可能沒有什麼感覺,因為你不知道他是幹嘛的。但是如果配合演算法來講解,你就...

第二章 演算法

一 演算法定義 二 演算法的時間複雜度與空間複雜度 1.定義 演算法是解決待定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。2.演算法的特性 演算法有五個基本特性 輸入 輸出 有窮性 確定性和可行性。演算法在一定條件下,只有一條執行路徑,相同的輸入只能有唯一的輸...