最小的k個數

2021-09-07 11:19:04 字數 3306 閱讀 2098

題目描寫敘述:

輸入n個整數。找出當中最小的k個數。比如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

輸入:每乙個測試案例包含2行:

第一行為2個整數n,k(1<=n。k<=200000)。表示陣列的長度。

第二行包括n個整數。表示這n個數,陣列中的數的範圍是[0,1000 000 000]。

輸出:相應每乙個測試案例,輸出最小的k個數。並按從小到大順序列印。

例子輸入:

8 44 5 1 6 2 7 3 8

例子輸出:

1 2 3 4
思路1:使用高速排序(或者其它排序)對這n個數進行排序。取出前k個就可以(o(nlogn))。

思路2:我們能夠使用快排的partition操作來解決這個問題。假設基於陣列的第k個數字進行調整。使得比第k個數字小的全部數字出如今其左邊。而比該數字大的出如今右邊,這樣,位於陣列中左邊的k個數字即為所求。

(o(n))

方案2**:

/*

最小的k個數

by rowandjj

2014/8/9

*/#include#includeint partition(int arr,int low,int high)

arr[low] = arr[high];

while(low < high && arr[low] <= val)

arr[high] = arr[low];

} arr[low] = val;

return low;

}//獲取最小的k個數

void getleastnumbers(int input,int n,int output,int k)

int low = 0,high = n-1;

int index = partition(input,low,high);

while(index != k-1)

else

}for(int i = 0; i < k; i++) }

//-------------------------

//這題要求最小的k個數保持有序,故而使用快排對其進行排序

void quicksort(int arr,int low,int high)

int index = partition(arr,low,high);

quicksort(arr,low,index-1);

quicksort(arr,index+1,high);

}int main()

int *arr = (int*)malloc(sizeof(int)*n);

if(!arr)

for(int i = 0; i < n; i++)

getleastnumbers(arr,n,output,k);

quicksort(output,0,k-1);

for(int j = 0; j < k; j++)

else

} free(arr);

} return 0;

}

[適合處理海量資料]思路3:能夠先建立乙個大小為k的資料容器來儲存最小的k個數字,接下來我們每次從輸入的n個整數中讀入乙個數,假設容器中已有的數字少於k個,則直接把這次讀入的整數放到容器中,假設容器中已有k個數字,此時我們不再插入新的數字。而僅僅能替換已有的數字。

找出這已有的k個數中的最大值,然後拿這次待插入的整數和最大值進行比較,假設待插入的值比當前已有的最大值小,則用這個數替換當前已有的最大值,假設待插入的值比當前已有的最大值還要大,那麼拋棄這個數。

容器能夠使用大頂堆來實現。

大頂堆的根始終最大。我們僅僅需將待插入的整數和堆頂進行比較就可以,假設發生替換,則僅僅需調整大頂堆堆頂元素(能夠使用堆排序中用到的那個heapadjust函式)。

**:

/*

最小的k個數

by rowandjj

2014/8/10

*/#include#includevoid heapadjust(int arr,int start,int end)

int temp = arr[start];

int i = start*2+1;

while(i <= end)

if(temp > arr[i])

arr[start] = arr[i];

start = i;

i = i*2+1;

} arr[start] = temp;

}bool getleastnumbers(int input,int n,int output,int k)

int count = 0;

bool needbuildheap = true;

for(int i = 0; i < n; i++)

else

needbuildheap = false;

}//大頂堆建好之後,比較當前遍歷的整數與堆頂元素大小

if(input[i] >= output[0])//大於等於堆頂元素

//假設比堆頂元素小,那麼須要交換

output[0] = input[i];

heapadjust(output,0,k-1);//又一次調整為大頂堆

}

} return true;

}//------------------------------------------

//由於要求從小到大排序,故而這裡來乙個堆排序

void heapsort(int arr,int len)

int i;

for(i = len/2-1; i >= 0; i--)

for(i = len-1; i > 0; i--) }

int main()

int output[200000];

int *arr = (int*)malloc(sizeof(int)*n);

if(!arr)

int i;

for(i = 0; i < n; i++)

getleastnumbers(arr,n,output,k);

heapsort(output,k);

for(i = 0; i < k; i++)

else

} free(arr);

} return 0;

}

最小的K個數

問題描述 給定的n個整數,計算其中最小的k個數。最直觀的解法莫過於將n個數按公升序排列後輸出前k個。但是就效率來看,這種方法並不是最理想的。一種改進方法是借助快速排序中對陣列的劃分,以第k個元素對陣列進行劃分,使得比第k個數字小的數字都在其左邊,比其大的數字都在它的右邊。void swap int ...

最小的K個數

從 陣列中出現次數超過一半的數字 得到啟發,同樣可以基於partition函式來解決。一 o n 演算法 void getleastnumbers int input,int n,int output,int k else for int i 0 i k i output i input i 二 o...

最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,如果不讓使用sort的話,自己實現乙個,或者依次選取最小的 class solution public vectorgetleastnumbers solution vectori...