排序面試題
線性表面試題
高頻算法面試題
時(shí)間復(fù)雜度指執(zhí)行這個(gè)算法需要消耗多少時(shí)間,也可以認(rèn)為是對排序數(shù)據(jù)的總的操作次數(shù)。常見的時(shí)間復(fù)雜度有:常數(shù)階O(1),對數(shù)階O(log2n),線性階O(n), 線性對數(shù)階O(nlog2n),平方階O(n2)。
//時(shí)間復(fù)雜度O(1)
sum = n*(n+1)/2;
//時(shí)間復(fù)雜度O(n)
for(int?i = 0; i < n; i++){
System.out.println("%d ",i);
}
//時(shí)間復(fù)雜度O(n^2)
for(int?i = 0; i < n; i++){
for(int?j = 0; j < n; j++){
System.out.println("%d ",i);
}
}
//運(yùn)行次數(shù)為(1+n)*n/2//時(shí)間復(fù)雜度O(n^2)
for(int?i = 0; i < n; i++){
for(int?j = i; j < n; j++){
System.out.println("%d ",i);
}
}
//設(shè)執(zhí)行次數(shù)為x. 2^x = n 即x = log2n,時(shí)間復(fù)雜度O(log2n)
int?i = 1, n = 100;
while(i < n){
i = i * 2;
}
O(1)< O(logn)<O(n)<O(nlog2n)<O(n2)<O(n3)<…<O(2n)<O(n!)
空間復(fù)雜度是指算法在計(jì)算機(jī)內(nèi)執(zhí)行時(shí)所需存儲空間的度量,它也是問題規(guī)模n的函數(shù)
常見的空間復(fù)雜度有:常量空間復(fù)雜度O(1)、對數(shù)空間復(fù)雜度O(log2N)、線性空間復(fù)雜度O(n)。
對于一個(gè)算法來說,空間復(fù)雜度和時(shí)間復(fù)雜度往往是相互影響的。當(dāng)追求一個(gè)較好的時(shí)間復(fù)雜度時(shí),可能會使空間復(fù)雜度的性能變差,即可能導(dǎo)致占用較多的存儲空間;反之,當(dāng)追求一個(gè)較好的空間復(fù)雜度時(shí),可能會使時(shí)間復(fù)雜度的性能變差,即可能導(dǎo)致占用較長的運(yùn)行時(shí)間。有時(shí)我們可以用空間來換取時(shí)間以達(dá)到目的。
假定在待排序的記錄序列中,存在多個(gè)具有相同的關(guān)鍵字的記錄,若經(jīng)過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,則稱這種排序算法是穩(wěn)定的;否則稱為不穩(wěn)定的。排序算法是否為穩(wěn)定的是由算法具體實(shí)現(xiàn)決定的??傮w上,堆排序、快速排序、希爾排序、直接選擇排序不是穩(wěn)定的排序算法,而冒泡排序、直接插入排序、歸并排序、基數(shù)排序、計(jì)數(shù)排序、桶排序是穩(wěn)定的排序算法。
比較類排序:通過比較來決定元素間的相對次序,由于其時(shí)間復(fù)雜度不能突破O(nlogn),因此也稱為非線性時(shí)間比較類排序。如冒泡排序、選擇排序、插入排序、歸并排序、堆排序、快速排序
非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時(shí)間下界,以線性時(shí)間運(yùn)行,因此也稱為線性時(shí)間非比較類排序。 如計(jì)數(shù)排序、基數(shù)排序、桶排序
A. 基數(shù)排序
B. 冒泡排序
C. 選擇排序
D. 歸并排序
答案:C
解析:選擇排序是不穩(wěn)定的,如{2*,2,1},第一次遍歷將2*與1互換,結(jié)果為{1,2,2*},2與2*位置互換
其余排序均是穩(wěn)定的
A. 插入排序
B. 快速排序
C. 堆排序
D. 歸并排序
答案:A
解析:插入排序:最佳O(N)
快速排序:最佳O(NlogN)
堆 排序:最佳O(NlogN)
歸并排序:最佳O(NlogN),因此選擇插入排序。