排序和順序統計學(演算法導論)

2021-07-06 08:13:24 字數 3823 閱讀 7297

1.堆排序

堆資料結構是一種陣列物件,它可以被視為一顆完全二叉樹。存放時利用了二叉樹,父親節點序號(i),子節點序號(2*i,2*i+1)的性質

堆的建立,調整,輸出例項如下:

#include#include#includeusing namespace std;

//root從data[1]開始存起

//我想到的是左右孩子先比較,返回大孩子序號。大孩子再與父節點比較,如果不調換,調整結束,直接返回;如果調換,調換後,再將大孩子作為序號遞迴呼叫調整函式。但他使用迭代似乎可以更加的簡潔

//大頂堆

void heapadjust(vector&data,int s,int l)//data為資料來源,s為需要調整的節點 ,l為有效節點個數

else

}}void heapmake(vector&data,int l)

}void heapoutput(vector&data,int l)

if(l%2==0)

heapmake(data,l);

heapoutput(data,l);

}

2.快速排序

過程不再詳述,遞迴版和非遞迴版例項如下:

#include#includeusing namespace std;

int qsortone(vector&p,int left,int right)

p[right]=p[left];

p[left]=a;

} return left;

}void qsort(vector&w,int left,int right)

qsort(a,0,a.size()-1);

for(int i=0;i#include#includeusing namespace std;

typedef struct node

;stacks;

int qsortone(vector&p,int left,int right)

p[right]=p[left];

p[left]=a;

} return left;

}void qsort(vector&w,int left,int right)

qsort(a,0,a.size()-1);

for(int i=0;i

3.中位數和順序統計學

a.以期望線性時間做選擇主要利用了快排的思想,結合隨機劃分,例項如下:

#include#include#includeusing namespace std;

int random(int start,int end)//產生乙個(start,end)之間的隨機整數

int qsortone(vector&p,int left,int right)//隨機快排

p[right]=p[left];

p[left]=a;

} return left;

}void findk(vector&w,int left,int right,int k)

else if(starta;

int temp;

int k;

cout

cout

findk(a,0,a.size()-1,k);

for(int i=0;ib.最壞情況的線性選擇

先把大陣列,劃分為等長的小陣列,對各個小陣列排序,用以找出各個小陣列的中位數,把各個中位數進行排序,用以找到中位數的中位數。然後把中位數的中位數作為劃分標準,進行劃分篩選。

例項如下:

#include#include#include#includeusing namespace std;

int random(int start,int end)

//比較元素已然確定,就不需要再在函式內部選了

int partition(vector&d,int left,int right,int k)

swap(d[i],d[j]);

} return j;

}//氣泡排序,用於對小組內元素排序

void bubble(vector&d,int left,int right)

} if(!exchange)

}}int select(vector&d,int left,int right,int k)

int i;

//如果排序個數大於75個,再用找中位數的中位數的方法來減少運算次數

for(i=0;i<=(right-left-4)/5;i++)

i--;

if((left+i*5+4)data;

int n;

cout

for(int i=0;i>k;

cout<

4.線性時間排序

以下三個排序方法,不是比較排序,不受nlogn下界影響a.計數排序果然大失所望,這種手法大家都用過,只是不知道名字罷了。

陣列a=,確定陣列a集合中,元素大小範圍0~19,開乙個大小為20的陣列b,b[ i ] = j ,其中i表示a集合中元素的值,j表示該元素值出現過的次數。這樣建立這個排序表的時間複雜度為o(n),查詢某個元素是否在其中的時間複雜度o(1),查詢某個元素在所有元素中的位置o(n),如查詢7位置,b[ 7 ]=b[ 0 ]+...+b[ 6 ],如果出現負值,就需要加上偏移量。

演算法缺點:需要事先知道元素的max和min;需要大量的輔助空間。

實現:

#include#include#includeusing namespace std;

int random(int s,int e)

void countsort(const vector&data,int maxv,vector&b)

for(int i=0;idata;

vectorb;

int num;

cin>>num;

for(int i=0;ib.基數排序

詳見數構,不瞎逼逼了

c.桶排序

演算法缺點:同樣要求數的分布範圍[ min , max ],空間消耗也較大。在每個桶排序過程中,會使用到其他排序演算法

演算法的主要思想: 待排序陣列a[1...n]內的元素是隨機分布在[0,1)區間內的的浮點數.輔助排序陣列b[0....n-1]的每乙個元素都連線乙個鍊錶.將a內每個元素乘以n(陣列規模)取底,並以此為索引插入(插入排序)陣列b的對應位置的連表中. 最後將所有的鍊錶依次連線起來就是排序結果

如圖,a為資料來源,b為模10後的桶

**例項如下:

#include#include#includeusing namespace std;

int random(int s,int e)

void insertsort(vector< vector> &b,int data)//偷懶,用動態陣列模擬了鍊錶

bucketsort(data,b,c);

for(int i=0;i

演算法導論之排序和順序統計學

排序 對n個數的序列重排過程。待排序的數,一般是選擇記錄中資料集的關鍵字key作為排序的值,而資料集中其他資料 稱為 衛星資料 以key為中心移動。實際上,對於排序過程中,key的移動和交換,衛星資料並不定跟著,只要記錄的指標隨key交換即可,將資料移動量減小到最小。關鍵字和衛星資料所構成的資料集,...

排序和順序統計學 2 快速排序

快排我接觸的也比較多了,從之前noip的時候演算法老師講的版本,到之前資料結構課上學習的版本,到現在 演算法導論 裡講的版本,我個人並不能不能區別它們的好壞,權且都寫出來,以後再來區別。三種實現方式如下 noip void qsort1 int a,int l,int r if l資料結構 int ...

排序和順序統計量(演算法導論)

人一生別太狂,指不定誰輝煌 總結排序演算法的執行時間 演算法最壞執行時間 平均期望執行時間 是否是原址排序 插入排序o n2 o n2 是 歸併排序o nlgn o nlgn 否 堆排序o n lgn 是快速排序o n2 o nlgn 期望 是 計數排序o k n o k n 否基數排序o d k ...