整理了下常用的排序演算法

2021-06-06 09:16:43 字數 1943 閱讀 9511

例子中都是從小到大排序的。

1、 插入排序

1.1、       直接插入排序:將乙個記錄插入到乙個有序的列表中,得到乙個新的,記錄數加一的新的列表。進行關鍵字比較和移動的次數約

n^2/4,

時間複雜度o(

n^2)。

1.2、       折半插入排序:在直接插入排序的基礎上減少比較的次數。其中「查詢」的動作用「折半查詢」來實現。只能減少比較的次數,不能減少移動的次數,時間複雜度o(

n^2)。

n較大的時候效果明顯。

1.3、       2-路插入排序:在折半插入排序上再改進,減少移動的次數。需要n個輔助空間,如a[n],從小到大排序,將第乙個數放在a[0]中,如果比a[0]大,放在後面,如果比a[0]小,放在前面。將陣列a看成乙個迴圈向量。移動的次數約為

n^2/8.

時間複雜度

o(n^2)。如果a[0]是最小的話,就失效了。

1.4、       希爾排序:主要是通過增量序列中5和3,把整個序列弄的基本有序。以減少排序的比較和移動的次數。【如何取增量序列,和如何計算時間複雜度沒有定論】

2、 快速排序

2.1、       起泡排序:每次比較後,將待排序的數中最大的那個放到最後。比較和移動的次數為

n*(n-1)/2

。時間複雜度o(

n^2)。

2.2、       快速排序:對起泡排序進行改進,每趟排序,將待排記錄中提取乙個關鍵字,將其分成兩塊,一塊都比這個關鍵字小,一塊都比這個關鍵字大。遞迴下去,直到結束。時間複雜度o(

n*logn

)。注意棧的深度。

非遞迴的版本:url:

#include

#include

using namespace std;

template

int partition(t a,int low,int high)

;//int i代表開始的位置,lenth總的長度

void heapsort(int a,int i,int lenth)

a[i] = tmp;

}int main()

{int t,tmp;

int i;

for(i = 0; i < num; i++)

cout< 0; t--)

{heapsort(a,t,num - 1);

for(i = 0; i < num; i++)

cout< 1; t--)

{tmp = a[1]; a[1]=a[t]; a[t]=tmp;

heapsort(a,1,t-1);

for(i = 0; i < num; i++)

cout<

4、 計數排序: 每次掃瞄所有的數,將比要排序的數小的數的個數記下來,然後將這個要排序的數放在個數+1的位置。

5、 基數排序:將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後, 數列就變成乙個有序序列。基數排序的時間複雜度是

o(k·n)

,其中n

是排序元素個數,

k是數字位數。

6、 桶排序:假定:輸入是由乙個隨機過程產生的[0, 1)區間上均勻分布的實數。將區間[0, 1)劃分為n個大小相等的子區間(桶),每桶大小1/n:[0, 1/n), [1/n, 2/n), [2/n, 3/n),…,[k/n, (k+1)/n ),…將n個輸入元素分配到這些桶中,對桶中元素進行排序,然後依次連線桶輸入0 ≤a[1..n] <1輔助陣列b[0..n-1]是一指標陣列,指向桶(鍊錶)。

7、歸併排序:歸併(merge)排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表。sr[1,2,3,…n],sr中為n個前後相鄰且長度為h的有序序列。時間複雜度為,空間o(n)。其中n是指序列的個數。

利用外存對資料檔案進行排序的方法稱為外部排序。

1、 簡單歸併排序。

常用排序演算法整理

1.氣泡排序 void bubble sort int s,int len 2.插入排序 void insert sort int s,int len 3.快速排序 採用分治法,先選取乙個數pivot,把小於pivot的數移到它的左邊,大於pivot的數移到它的右邊,然後進行遞迴呼叫 int par...

整理了一下買的電腦書,整理了一下學習思路

這幾天,整理了整理以前買的電腦技術書籍,發現有不少書還沒有看過,挑了一本 程式設計師修練之道 先看著,這本書兩年多前就買了,以前在學校裡的時候看了大概四分之一,記得看到這部分的時候覺得內容於實際不太搞界,看起來比較吃力,所以就擱下了。一直沒看,這幾天終於把全本書看完了。由於自已現在從事軟體開發,所以...

整理了一下自己的空間

明天就開始放五一大假 上班不想做工作相關的東西,但沒辦法,還是得做個樣子 有點不厚道吧 偷偷上來看我的blog,已經落了乙個月沒有寫東西!同時在網上轉悠,看到了乙個他自已建的blog站點。看的很勤快,雖然有些篇幅寫的不是很長,但卻真實記錄著他的生活和工作,記錄著他的成長和思想。尤其喜歡他logo上的...