題目描寫敘述:
輸入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...