關於演算法與資料結構的相關博文:
二叉樹相關練習題(c++)
經典排序演算法的c++實現
與字串有關的一些典型問題的c++解法
一些可以用動態規劃(dp)演算法解決的問題(c++)
排列組合相關筆試面試題(c++)
與概率相關的演算法題c++解法(附證明過程)
二分查詢的巧妙運用(c++)
位運算在演算法題中的使用(c++)
鍊錶相關練習題(c++)
用例項講解棧和佇列(c++)
一些智力題的c++解法
kmp演算法相關學習資料
leetcode經典題目筆記(一)
leetcode經典題目筆記(二)
1、小範圍排序
已知乙個幾乎有序的陣列,幾乎有序是指,如果把陣列排好順序的話,每個元素移動的距離可以不超過k,並且k相對於陣列來說比較小。
選擇改進的堆排序。根據題意,最小值一定在a的前k(0~k-1)個元素內、次小值一定在a的第二組k(1~k)個元素內,以此類推,每次取原陣列a的k個元素進行堆排序,然後把堆頂元素放入a的已排序序列中,(0~k-1)排序的堆頂賦值給a[0],(1~k)排序的堆頂賦值給a[1],以此類推。最後剩下a中最後的k個元素(k-n~n-1),進行標準的堆排序,第一次是k個元素的堆,排序後將堆頂賦值給a[n-k],緊接著把堆尾元素賦值給堆頂,再排序,此時只是k-1個元素的堆,依次類推,每次把堆頂元素放入a中已排序序列後,都把堆尾元素賦值到堆頂,同時堆的元素個數減1,直到堆的元素個數為1,整個排序結束。
class
scalesort
b[i] = ex; r
eturn
; }
vector
sortelement(
vector
<
int > a,
int n,
int k)
for(int
i = k/2-1;i >= 0;i--)
heapify(temp,i,k); f
or (
int i = k;i < n;i++)
for(int
j = n-k;j < n;j++)
delete
temp;
temp = null;
return
a; }
};
2、求乙個陣列排序後相鄰元素之差的最大值,時間複雜度為o(n)、空間複雜度為o(n)
若先排序後求差值則只有桶排序滿足時間複雜度,但是桶排序不能滿足空間複雜度,桶排序的空間複雜度為o(max-min)。因此要用改進的桶排序但是又沒有真正的排序。
①、求出陣列a的最大值max和最小值min,並把區間max-min平均分成n份,每份大小為interval,則只需要n+1個桶;
②、用a[i]-min/interval的整數部分確定a[i]該入的桶,並定義三個大小為n+1的陣列,bucket記錄n+1個桶每個桶的入桶元素個數,max_bucket記錄每個桶中最大值,min_bucket記錄每個桶中最小值;
③、遍歷bucket陣列,將後乙個桶的最小值min_bucket[j]減去前乙個桶的最大值max_bucket[j-1],記錄下最大的差值,返回該差值。
class
gap
float
interval = (
float
)(max - min)/n;
intbucket[n+1];
for (
intj = 0;j < n+1;j++)
bucket[j] = 0;
intmax_bucket[n+1],min_bucket[n+1];
for (
inti = 0;i < n;i++)
for (
inti = 0;i < n;i++)
intmaxgap = 0;
for (
inti = 0,j = 1;j < n+1;j++) }
return
maxgap; }
};
小範圍排序
已知乙個幾乎有序的陣列,幾乎有序是指,如果把陣列排好順序的話,每個元素移動的距離可以不超過k,並且k相對於陣列來說比較小。請選擇乙個合適的排序演算法針對這個資料進行排序。給定乙個int陣列a,同時給定a的大小n和題意中的k,請返回排序後的陣列。測試樣例 2,1,4,3,6,5,8,7,10,9 10...
小範圍排序
給定乙個int陣列a,同時給定a的大小n和題意中的k,請返回排序後的陣列。時間複雜度 o n 的.桶排序 由於陣列大小和區別無法確定,最好別用 時間複雜度 o nlogn 的 堆排序 已經每個元素最多移動k個距離,那麼最下的那個數移動到陣列第乙個位置距離最多為k,可以建立長度為k的小根堆,並且彈出堆...
小範圍排序 使用堆排序
已知乙個幾乎有序的陣列,幾乎有序是指,如果把陣列排好順序的話,每個元素移動的距離可以不超過k,並且k相對於陣列來說比較小。請選擇乙個合適的排序演算法針對這個資料進行排序。給定乙個int陣列a,同時給定a的大小n和題意中的k,請返回排序後的陣列。測試樣例 2,1,4,3,6,5,8,7,10,9 10...