題目描述:力扣思路:快速排序的變形,不需要完全排序
由partition函式返回的下標將陣列分成2部分,前邊大於等於下標元素,後邊小於等於下標元素,
當該下標等於k-1時(因為陣列下標是從0開始的,所以是k-1),直接返回陣列的前k個元素;
當返回的下標大於k-1時,只需要對下標前部分進行排序,後部分元素不需要;
當返回的下標小於k-1時,需要對後部分進行排序,前面的不需要;
在partition函式中需要注意的是以第乙個元素為基準時,先進行的是從後往前遍歷,找到小於基準值的元素,將其值賦給low指向的位置,再進行從前向後的遍歷,找到大於基準值的元素,將其值賦給high指向的元素。
class solution ;
return quicksort(arr, 0, arr.length-1, k-1);
}public int quicksort(int arr , int low , int high, int k)
if(i>k)
else
} public int partition(int arr, int low, int high)
arr[low]=arr[high];
while(high > low && arr[low]<=base)
arr[high]=arr[low];
} arr[low]=base;
return low;
}}
最小的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...