七大排序演算法(上)

2022-07-31 20:03:21 字數 2014 閱讀 2938

排序的定義非常簡單,就是把亂序狀態下的眾多元素整理成有序狀態。關於排序,有穩定和不穩定之分。關於排序演算法,有內排序和外排序之分。本文將對內排序的眾多演算法進行實現和比較。首先,我們來看一下衡量乙個演算法效能的因素:

(1)時間效能:在內排序演算法中,主要有兩種操作:比較和移動。衡量乙個演算法的優劣時,時間效能是最重要的標誌。

(2)輔助空間:評價演算法好壞的另乙個關鍵因素就是執行演算法時所需要的輔助儲存空間。此處的輔助空間不包括待排序資料所佔的空間,而是指完成排序過程中額外需要的空間。

(3)演算法複雜性:指演算法本身的複雜度,而不是指演算法的時間複雜度,當然兩者之間有著不可分割的關係。

(1)氣泡排序

(2)簡單選擇排序

(3)直接插入排序

(4)希爾排序

(5)堆排序

(6)歸併排序

(7)快速排序

其中前三種屬於簡單排序演算法,後四種屬於改進演算法。下面將分別介紹以上七種排序演算法。由於交換操作非常常見,此處先列出此函式,以備後用:

private void swap(int array, int i, int j)
氣泡排序演算法幾乎是計算機相關專業中路人皆知的排序演算法,因其最大值依次向後冒出,就像沸水中的氣泡一樣依次冒出而得名。簡單粗暴,直接上**就好。

public void bubblesort(int array) }}

}

其中唯一需要注意的是演算法中設定了乙個flag,標誌每一步冒泡後該陣列是否還需要排序,避免了不必要的比較。氣泡排序的時間複雜度為0+1+···+n-1=(n-1)n/2,也就是o(n*n)。

大家觀察冒泡演算法時得知每次比較之後,都要進行交換。其實這是沒必要的,因為我一次遍歷比較完成後,確認了最小值的位置之後再與第乙個位置進行資料交換也不遲。這樣雖然比較次數不能節省,但資料交換次數卻可以大大節省。簡單選擇排序其實非常簡單,依然簡單粗暴,直接看**:

public void selectsort(int array) 

}

簡單選擇排序演算法雖然較氣泡排序少了很多的資料交換,但是比較操作並沒有少,因此演算法複雜度仍為0+1+···+n-1=(n-1)n/2,也就是o(n*n)。雖然如此,其效能還是略優於氣泡排序。

直接插入排序演算法與前述兩演算法稍有不同,生活中與其息息相關的就是摸牌、碼牌啦。假如我們先把所有牌摸完,再排序。比如說,第一張牌你不需要排序,排第二張時就要考慮應該放到第一張牌的前面還是後面。。。。這樣,等到排第n張牌時,前n-1張牌已經有序,你只需從後向前遍歷,只要此處的牌比第n張牌大,就將此處的牌後移一位(當然你應該先把第n張牌暫存起來,以免被覆蓋掉)。。。直到某張牌不再比第n張牌大,這張牌也就是第n張牌應該放的位置。這樣第n張牌就排好啦。再排下一張,直到排完為止。邏輯應該比較簡單,還是直接上**好啦。

public void insertsort(int array) 

}}

輔助空間只有乙個,就是暫存第n張牌用到的那個空間。可以推出,平均比較和移動的操作約為n * n / 4 次,演算法複雜度為 o(n*n)。另外需要注意的是,最後的index多遞減了1次,記得加上啊。

直接插入排序中每次比較之後進行後移操作,確實通俗易懂,但是仔細想想,步子太小(步子為1),乙個居於靠後位置的較小的元素小碎步走了很多步才走到該排的地方,如果步子大一點,一次性跨越幾個元素,每次都保證基本有序,最後再對乙個基本有序的陣列進行步長為1的排序,這樣會不會省去很多資料交換的操作呢。希爾做了此番嘗試,證明果然是醬紫。先上**:

public void shellsort(int array) 

array[index + increment] = temp;

}} } while (increment > 1);

}

關於步長的計算公式為啥時最好,至今沒有定論。此處increment = increment / 3 - 1 的步長減小公式應該是乙個價效比較高的公式。此演算法時間的複雜度為o(n的3/2次方),好於直接排序的o(n*n)。注意,希爾排序並不是穩定排序,因為它的比較是跳動的。

七大排序演算法

氣泡排序 void bubble int a,int n 選擇排序 void select sort int a,int n n為陣列a的元素個數 將第i 小的數,放在第i 個位置 如果剛好,就不用交換 if i min index 插入排序 typedef int elementtype void...

七大排序演算法

七大排序分類 插入排序 直接插入排序 穩定 希爾排序 不穩定 選擇排序 簡單選擇排序 穩定 堆排序 不穩定 交換排序 氣泡排序 穩定 快速排序 不穩定 歸併排序。直接插入排序 時間複雜度 o n 2 演算法穩定性 穩定void straightinsertsort int a,int n 氣泡排序 ...

七大排序演算法

首先回顧下各種排序的主要思路 一 氣泡排序 氣泡排序主要思路是 通過交換使相鄰的兩個數變成小數在前大數在後,這樣每次遍歷後,最大的數就 沉 到最後面了。重複n次即可以使陣列有序。氣泡排序改進1 在某次遍歷中如果沒有資料交換,說明整個陣列已經有序。因此通過設定標誌位來記錄此次遍歷有無資料交換就可以判斷...