6、歸併排序
原理:將兩個及以上的有序表合併成乙個有序表。將待排序列分成若干個序列,將各個小序列排成有序,最後合併將整個有序序列。基本思路,開始,將相鄰兩個元素合併成乙個有序序列,然後,相鄰兩個序列再合併成乙個有序序列,不斷迴圈,直到整個序列合併為乙個有序序列。
示例如下:
**實現:
public class mergesort else
}while(left <= middle)
while (mid <= right)
while(i <= right)
}public static void mergesort(int arr,int left,int right)
}public static void main(string args);//test
mergesort(arr,0,arr.length-1);
system.out.println(arrays.tostring(arr));}}
演算法分析:
(1)效能分析
(2)時間複雜度
歸併排序的形式是一棵二叉樹,它遍歷的次數就是二叉樹的深度,根據完全二叉樹可以得到它的時間複雜度為o(nlog2n);
(3)穩定性
歸併排序中,相等元素的前後順序不會改變,所以它是一種穩定的演算法。
(4)空間複雜度
在排序過程中,需要大小為n的空間儲存整個序列,所以其空間複雜度為o(n)。
7、堆排序
原理:堆排序是一種樹形排序演算法,利用堆(順序儲存的完全二叉樹)進行排序,利用大根堆(或小根堆)堆頂記錄最大(或最小)的特徵,使得在無序區中獲得最大(或最小)記錄變得簡單。堆是一棵順序儲存的完全二叉樹,若每個節點的值小於或等於其左右孩子節點的值,稱為小根堆;每個節點大於等於其左右孩子節點的值,稱為大根堆。
舉例來說,對於序列,滿足下列條件之一,稱為堆:
(1) 當ri <= r2i+1 && ri <= r2i+2,稱為小根堆;
(2) 當ri >= r2i+1 && ri >= r2i+2,稱為大根堆;
思想:(1) 將原始陣列構建堆公升序排列構建大根堆(降序排列構建小根堆),從最後乙個節點開始調整,構建初始堆;
(2) 每一次交換r0和rn,輸出rn(最大元素),再把剩下元素調整為大根堆,當輸出最後乙個元素,則排序完成(公升序排列)。
舉例如下:
初始序列為:
**如下:
public class heapsort
//若父節點大於等於孩子節點的值,結束
if(temp >= arr[child])
arr[parent] = arr[child];
//選取孩子節點的左孩子節點,繼續向下篩選
parent = child;
child = 2*parent+1;
}arr[parent] = temp;
}public static void headsort(int arr)
//將最後乙個元素與第乙個元素交換
for(int i = arr.length-1;i > 0;i--)
}public static void main(string args);
system.out.print("排序前:");
system.out.println(arrays.tostring(arr));
headsort(arr);
system.out.print("排序後:");
system.out.println(arrays.tostring(arr));}}
演算法分析:
(1)效能分析
(2)時間複雜度
堆的儲存表示是順序的(完全二叉樹是順序儲存的),當需要對第k個最小的元素之前的部分序列進行排序,最好用堆排序。
(3)穩定性
堆排序是一種不穩定的演算法,在篩選調整時,有可能對於相同的元素排在後面的交換到前面來。
排序演算法(三) 選擇排序演算法
選擇排序演算法首先從序列中選擇乙個元素arr i 通常是第乙個 作為當前最小值,然後把arr i 依次與序列中arr i 之後的元素作比較,如果有元素小於arr i 的,就讓它跟arr i 交換。然後再選擇arr i 1 作為下一輪比較的最小值,然後繼續比較.選擇排序演算法原理很簡單,就是每次把未排...
排序演算法(三)
對於輸入的資料x存入標記為x的陣列中,並統計x的個數。適用於資料範圍小,資料量大的情況。演算法的步驟如下 1.找出待排序的陣列中最大和最小的元素 2.統計陣列中每個值為i的元素出現的次數,存入陣列c的第i項 3.對所有的計數累加 從c中的第乙個元素開始,每一項和前一項相加 4.反向填充目標陣列 將每...
排序演算法(三)
希爾排序是1959年由d.l.shell提出來的,相對直接排序有較大的改進。希爾排序又叫縮小增量排序。基本思想 基本思想 演算法先將要排序的一組數按某個增量d n 2,n為要排序數的個數 分成若干組,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然後再用乙個較小的增量 d 2 對它進行分...