小範圍排序(C )

2021-07-12 07:26:44 字數 2039 閱讀 3971

關於演算法與資料結構的相關博文:

二叉樹相關練習題(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...