排序總結(下)

2021-09-29 17:34:16 字數 3408 閱讀 4061

一.堆排序

(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...