1.堆排序
堆資料結構是一種陣列物件,它可以被視為一顆完全二叉樹。存放時利用了二叉樹,父親節點序號(i),子節點序號(2*i,2*i+1)的性質2.快速排序堆的建立,調整,輸出例項如下:
#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);
}
過程不再詳述,遞迴版和非遞迴版例項如下:3.中位數和順序統計學#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
a.以期望線性時間做選擇主要利用了快排的思想,結合隨機劃分,例項如下:4.線性時間排序#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<
以下三個排序方法,不是比較排序,不受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 ...