##目錄
初級排序
選擇排序
插入排序
希爾排序
歸併排序
自頂向下排序
自底向上排序
快速排序
優先佇列
##初級排序 ###一、 選擇排序
簡述:選擇排序就是遍歷一遍陣列把最小的和第乙個數字交換。第二遍遍歷陣列時候選擇和第二個交換,一次類推。
//注意不要在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.演算法的特性 演算法有五個基本特性 輸入 輸出 有窮性 確定性和可行性。演算法在一定條件下,只有一條執行路徑,相同的輸入只能有唯一的輸...