主關鍵字唯一區分不同資料,否則為次關鍵字。主關鍵字排序具有唯一性,次關鍵字否。若相同次關鍵字的元素排序可能發生交換順序,則稱演算法不穩定。常用排序演算法優劣衡量指標:
❶時間效能好。即較少的關鍵字比較次數和元素移動次數。
❷空間效能好。即輔助快取小。
❸穩定性。即相同次關鍵字元素,排序前後相對位置恆定
❶原理:從第2個元素開始,假設前面的元素已經排序完畢,每次將後序乙個元素插入至前面合適位置。❷特點:穩定。適用基本有序或者排序或者元素個數少。
❸偽**:
viod insertsort (int data,int n)
int temp;
int i,j;
for i=1:n-1
temp=data[i];
j=i-1;
while(j>-1 &&temp
❹二分法直接插入。先尋找合適的插入位置。繼而移動元素,然後插入。減少了比較次數,移動次數未變。
templatevoid insertsort(t (&data)[n])
} else
low = i;
for (j = i - 1; j >= low; j--)//資料向後移動
data[j + 1] = data[j];
data[low] = temp;// 插入數值
}}
❶原理:又稱最小增量排序。希爾排序先將元素分為若干不重疊小組。每個小組分別直接排序。小組個數逐漸減小。最後在乙個組排序完成。希爾排序基於直接排序在基本有序元素列的高效率考慮。❷特點:不穩定。
❸偽**:
void shellsort(int data,int n,int d,int m)
int span,temp;
int i,j,k,key;
for(i=0;i=0&&temp>data[key])
data[key+span]=data[key];
key-=span;
data[key+span]=temp;
}
分析:shell排序時間效能優於直接選擇排序。
1)初始時候步長比較大,每組元素少,排序很快。
2)後來基本有序,使用直接插入的時間也較快。
❶原理:選取最小的元素作為第乙個元素,繼而尋找第2大的元素作為第2個元素。繼而依次....❷特點:不穩定。
❸偽**:
viod insertsort (int data,int n)
int min;
int temp;
for(int i=0;idata[j])
min=j;
if(min!=i)//將最小元素放在比較序列的最前面
temp=data[i];
data[i]=data[min];
data[min]=temp;
❶堆:以大跟堆為例,滿足3個性質。根節點最大;從大根堆至任何葉子節點的路徑,非遞增有序;任意非空左右子樹均為大根堆。❷原理:調整堆
❸特點:不穩定。不適宜元素少或者排列有序的情況,適合元素多且亂序情況。堆不穩定因為需要每次最後乙個元素和堆頂元素交換。
void adjustheap(int a,int n,int k)//調整堆,已知a[k+1]----a[n-1]已經為堆。調整根節點為a[k]的堆
} a[k]=temp;//根節點賦值給當前子節點
}void heapsort(int a,int n)
}
❶原理:兩兩比較大小,將較大的元素像右移動。因此先是最大元素移動至列尾,繼而是次最大..........❷特點:比直接插入和直接排序移動次數多。是最慢的一種方法。
❸偽**:
void bubblesort(int data,int n)
}
❶原理:又稱為劃分排序。選取基本元素,將小於基本元素向前移動。大於基本元素的向後移動。最後將基準元素左右2邊分別作為子區間遞迴呼叫。❷特點:需要附加棧空間。不穩定(涉及到元素交換)。平均速度最快。可以比較居中元素,前後元素。取三者中居中的作為基本元素,並將其移動至隊前列。輔助空間o(log2n).
❸偽**:
void quickresort(int data, int low, int high)
思想:通過對映函式將n個數對映至m個桶中(比如劃分區間),在單獨對每個桶的數進行單獨排序比如快速排序。時間複雜度為o(n+n*log(n/m)),最好為o(n)此時每個桶只有乙個數,但是空間很大,最壞為log(nlogn),此時所有的數都被分到乙個桶裡面。
桶排序的穩定性取決於單個桶的排序演算法。若是快速排序則不穩定。
計數排序是桶排序的特例,此時對映函式未f(x)=x,桶的個數為max+1
一種適用於關鍵值為整形的高效排序法。設數字為m位d進製數(如1234為4位10進製數)。則定義d個桶。對於總數為n的d進製位的數。最好最差平均時間均為o(m*n),輔助儲存方面,若採用鏈式佇列,則為o(n);考慮順序佇列,因為要考慮最差情況,則o(n*d),此時被n個數進入同乙個佇列,實現需要分配d*n個輔助儲存單元.
思想:先排最低位進桶,再排次地位進桶,依次按序號進桶。
桶使用佇列儲存,保證先進先出。為穩定演算法。
//m位d進製
void radixsort(int data,int length,int m,const int d){
queue* q=new queue[d];
int power;
for(int i=0;i
❶從時間角度。
平均。直接插入,直接選擇,冒泡均為o(n.^2)。堆,歸併,快速為o (nlogn)。希爾排序基於2者之間。
最好。直接插入,冒泡和直接插入為o(n)最好。快速,歸併,堆次之為 o (nlogn)。
最差。堆和歸併仍然為 o (nlogn),其它為o(n.^2)
❷從空間的角度。歸併最差,需要o(n)。快速為o(logn)(輔助棧空間)。其它均為o(1)。
❸從穩定角度只要直接插入,歸併,冒泡,基數,
計數 排序穩定。
❹總結:數目多且隨機。記憶體容許要求穩定可以用歸併;記憶體不容許或者不要求穩定,可以用堆排序。直接插入和冒泡在最好的情況下效能最好。當n比較大且隨機分布時,快速排序效果好。當n很大時且關鍵字很小,使用基數排序。
❺.std::sort封裝了快速排序演算法,因此是不穩定的,如果要使用穩定排序,可以用std:stable_sort
另外,二叉樹排序法的時間複雜度,最壞為o(n.^2),平均為o(nlogn).空間複雜度為o(n)
論秋招中的排序 排序法彙總 中篇
續論秋招中的排序 排序法彙總 上篇 由於篇幅過大 下面我們繼續學習。論秋招中的排序 排序法彙總 上篇 論秋招中的排序 排序法彙總 中篇 待續 原創,須註明原處 5 快速排序 快速排序在面試中經常被問到 包括各種改進思路 此排序演算法可以說是用得最為廣泛的排序演算法,是對氣泡排序的一種改進,每次交換是...
C語言 氣泡排序法總結彙總
如果有n個數進行氣泡排序,那麼需要經過n 1趟排序,第一趟n 1次兩兩比較,第n 1趟進行1次兩兩比較,即第j趟進行n j次兩兩比較。趟數決定了比較的次數,用兩個for迴圈聯絡起來,當然也有其他的辦法,後續補充。如圖所示 定義行列和十個數 for i 0 i 10 i 變數i表示比較的趟數 for ...
Java學習記錄(04) 排序法彙總
注 方法暫不完整,近期補充完善 方法暫未封裝 氣泡排序法 要點 定義temp flag 內層迴圈 jflag 設定標誌位,如果發生交換,則為true否則為false。如果某一次沒有發生交換,說明排序已經完成。在序列基本有序的情況下,flag的設定可以有效節省開銷。內層迴圈 j迴圈一次沉乙個最大值,下...