一.堆排序
(1)思想
基本原理也是選擇排序,只是不在使用遍歷的方式查詢無序區間的最大的數,而是通過堆來選擇無序區間的最大的數。
注意: 排公升序要建大堆;排降序要建小堆。
(2)實現
public static void heapsort(int array)
}public static void creatheap(int array)
}public static void shiftdown(int array,int size, int index)
if(array[parent] < array[child])
parent = child;
child = 2 * parent + 1;}}
public static void swap(int array, int left, int right)
(3)效能分析
時間複雜度 空間複雜度
o(n * log(n)) o(1)
資料不敏感 資料不敏感
穩定性:不穩定
二.氣泡排序
(1)思想
在無序區間,通過相鄰數的比較,將最大的數冒泡到無序區間的最後,持續這個過程,直到陣列整體有序
(2)實現
public static void bubblesort(int array)}}
}
(3)效能分析
時間複雜度 空間複雜度
最好 平均 最壞
o(n) o(n^2) o(n^2) o(1)
資料有序 資料逆序
穩定性:穩定
(3)快速排序
(1)思想
從待排序區間選擇乙個數,作為基準值(pivot);
partition: 遍歷整個待排序區間,將比基準值小的(可以包含相等的)放到基準值的左邊,將比基準值大的(可以包含相等的)放到基準值的右邊;
採用分治思想,對左右兩個小區間按照同樣的方式處理,直到小區間的長度 == 1,代表已經有序,或者小區間的長度 == 0,代表沒有資料。
(2)實現
遞迴實現
public static void quicksort(int array)
public static void quicksortinternal(int array, int left, int right)
// 最簡單的選擇基準值的方式,選擇 array[right] 作為基準值
// pivotindex 代表基準值最終停留的下標
int pivotindex = partition(array, left, right);
// [left, pivotindex - 1] 都是小於等於基準值的
// [pivotindex + 1, right] 都是大於等於基準值的
quicksortinternal(array, left, pivotindex - 1);
quicksortinternal(array, pivotindex + 1, right);
}public static int partition(int array, int left, int right)
while(left < baseindex && basevalue <= array[baseindex])
swap(array, left, baseindex); //交換
}swap(array, right, left); //交換基準值
return left;
}
非遞迴實現
其實和遞迴差不多,就是把他的左右界限,放到棧中,執行玩partition函式就分成倆半,需要快速排序的陣列,繼續放到棧中,直到棧空。
public static void quicksortbyloop(int array)
int pivotindex = partition(array,left,right);
//左半部分進棧
stack.push(pivotindex - 1);
stack.push(left);
//右半部分進棧
stack.push(right);
stack.push(pivotindex + 1);
}}
(3)優化
你有沒有想到牽涉到遞迴,會有空間不夠用的問題,所以就得做出優化。
下面是一些簡單的優化
(1) 在待排序區間選擇乙個基準值
選擇基準值選最前面,最後面可能是最大值,那他就一直只能分為1個陣列,另乙個就是最大值。
選擇左邊或者右邊
隨機選取
幾數取中法
(2)做 partition,使得小的數在左,大的數在右
(3) 待排序區間小於乙個閾值時(例如 48),使用直接插入排序
分治處理左右兩個小區間,直到小區間數目小於乙個閾值,使用插入排序。
(4)效能分析
時間複雜度 空間複雜度
最好 平均 最壞 最好 平均 最壞
o(n * log(n)) o(n * log(n)) o(n^2) o(log(n)) o(log(n)) o(n)
穩定性:不穩定
四.歸併排序
(1)思想
歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide andconquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。
(2)實現
public static void mergesort(int array)
public static void mergesorthelper(int array, int left, int right)
int mid = (left + right) / 2; //取中間值
mergesorthelper(array, left, mid); //遞迴左邊,
mergesorthelper(array, mid, right); //遞迴右邊
mergr(array, left, mid, right); //將遞迴後的數祖歸併。
}public static void mergr(int array, int left, int mid, int right) else
}while(i < mid)
while(j < right)
for(int k = 0; k < length; k++)
}
(3)效能分析
時間複雜度 空間複雜度
o(n * log(n)) o(n)
資料不敏感 資料不敏感
穩定性:穩定
總結下吧 2008 05 10 09 11
直接把上交的總結扔上來了.gdcpc2008總結分割線 最後一場正式比賽結束了,結果不如預想中的好.不過走出賽場,倒也沒多少遺憾的感覺.要說遺憾,去年已經夠遺憾了.而且就自己來說,這次比賽還算是發揮得不錯.先流水帳一下過程吧 拿到題目,xj看a,b,c,yzx看d,e,f,我看g,h,i,j.a題 ...
小小地總結下
好久沒見gb了,不知道他最近忙啥。上上周末晚上我倆在泊月長廊聊了會兒,那個冷啊 t t 最終確定了我這週的方向,把zoj的最短路刷乾淨還有刷usaco。介於usaco難看的介面,我決定刷最短路,用我寫的c程式算了下,zoj論壇裡的最短路我還剩八題 當時感覺,一星期應該沒啥問題吧。我發現,我對著電腦似...
layer簡介 總結下
layer tiledmapservicelayer arcgistiledmapservicelayer dynamiclayer dynamicmapservicelayer arcgisdynamicmapservicelayer arcgisimageservicelayer gpresul...