排序演算法的分析 一

2021-09-04 13:32:00 字數 2035 閱讀 1226

在演算法導論中,將插入排序比作現實中對撲克牌的排序。將乙個要排序的陣列 [1 , n],看成撲克牌的總數,下標 j 作為正被插入手中的牌,[1 ,j-1] 就是當前排好序的左手中的牌,[j+1 , n]就是牌桌上剩餘的牌,而[1 , j-1]正是原來在位置1到j-1的元素,只是已經排好序,所以稱[1 , j-1]表示為乙個迴圈不變式

初始化: 第一次迭代前為真;

保持: 如果迴圈某次迭代前為真,那麼下次迭代也為真;

終止: 在迴圈終止時,不變式會為我們提供乙個有用的性質

初始化:當 j = 0 時,即第一次迴圈迭代之前,很明顯是成立的

保持:arr[j]依次跟它之前已排好序的元素進行比較,小的就移到前面,直到找到arr[j]的合適位置這時子陣列有[0 , j)組成,但已排好序,所以在下一次迭代,將保持迴圈不變式

終止:當j = arr.length,迴圈終止,子陣列[0 , n)有原來的arr[0...n]中的元素組成,但已排好序,而子陣列就是整個陣列,因此我們的演算法是正確的。

要注意的一點是跟已排好序的元素進行比較的是 比較之前下標j的元素,而迴圈比較過程中如發生交換則下標j的元素是會發生改變的,所以應先記錄比較前下標j的元素

public static void sort_asc(int arr) 

int key,i;

for (int j = 1;j < arr.length;j++)

arr[i + 1] = key;}}

public static void sort_desc(int arr) 

for (int i = 1;i < arr.length;i++) }}

}

插入排序採用的是增量方法: 在排序子陣列a[1..j-1]後,將單個元素a[j]插入子陣列的適當位置,產生排序好的子陣列a[1..j];而 歸併排序採用的是 '分治法' 的策略: 將原問題分解成幾個規模較小的類似於原問題的子問題,遞迴地求解這些子問題,最後再合併這些子問題的解來建立原問題的解

分治模式在每層遞迴都有三個步驟

將原為題分解成若干子問題,這些子問題是原問題規模較小的例項

解決這些子問題

合併這些子問題的解成原問題的解

子序類和並方法

/**

* 子陣列合併方法

* p <= q < r

*/private static void marge(int a,int p,int q,int r) else }}

初始化: 在迴圈的第一次迭代之前,有 k = p, 所以子陣列a[p..k-1]為空包含l和r的k - p = 0個元素。又因為 i = j = 0, 所以l[i]和r[j]都是各自所在陣列中未被複製會陣列a的最小元素

保持: 假設l[i] <= r[j],這時,l[i] 作為兩個子陣列的最小元素複製給a[k],子陣列a[p..k] 將包含 k - p + 1 個最小元素。增加 i 和 k 的值後,為下一次迭代重新建立了該迴圈不變式。反之,若l[i] > r[j] 亦然。

終止: 終止時 k = r + 1。根據迴圈不變式,子陣列a[p..k-1]就是a[p..r]按從小到大且包含l[0..n1] 和 r[0..n2]中的 k - p = r - p + 1個最小元素。 

public static void sort_asc(int a,int p,int r) 

}

使用演算法導論中的主方法求解: 有

排序演算法的分析

排序分為 1 插入排序 直接插入 折半插入 希爾 2 選擇排序 簡單選擇 堆排序 3 交換排序 冒泡 快速 4 歸併排序 基數排序 一 排序過程的特點 1 氣泡排序和堆排序在每趟處理後,都能產生當前的最大值或最小值 即序列頭或尾是有序的 2 簡單選擇排序和直接插入排序,每趟排序後其前面均為有序的。3...

排序演算法分析

所謂排序,即將原本無需的乙個序列重新排列成有序的序列。注意,這個序列中的每一項可能是單獨的資料元素,也可能是一條記錄。所謂穩定性,是指排序中的序列中有兩個或者兩個以上相同的資料項,排序前後,這些相同的資料項相對位置沒有發生變化,那麼這個排序演算法是穩定的。下面就幾種常見排序演算法進行總結分析,並會加...

排序演算法分析

注 都是以增序為例說明!一 氣泡排序 a 原理 從陣列的第乙個位置開始,依次兩兩比較array index 與array index 1 如果array index 大於array index 1 則利用temp交換兩者位置,直到陣列結束。從陣列的第乙個位置開始,重複上面的動作,直至第n 1個位置結...