例子中都是從小到大排序的。
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上的...