بعد الحصول على هذا السؤال، ستفكر أولاً في الفرز. بعد الفرز، حدد أكبر رقم K. اختيار الفرز يعتبر الفرز السريع خيارًا أفضل.
حسنًا، فلنقم بالحل الأول: الفرز السريع
الرمز هو كما يلي
انسخ رمز الكود كما يلي:
public static void QuickSort(int[] arr, int start, int end) {
إذا (البدء <النهاية) {
int key = arr[start];
int right = start;
int left = end;
بينما (يمين <يسار) {
بينما (يمين <يسار && arr[يسار] > مفتاح) {
غادر --؛
}
إذا (يمين <يسار) {
arr[right] = arr[left];
}
بينما (يمين <يسار && arr[يمين] <= مفتاح) {
حق++;
}
إذا (يمين <يسار) {
arr[left] = arr[right];
}
}
arr[right] = key;
QuickSort(arr, start, right-1);
QuickSort(arr, left+1, end);
}
}
بعد الفرز السريع، ستكون المصفوفة مرتبة، والفرز أعلاه من الصغير إلى الكبير، لذا يجب أن يكون الناتج كما يلي
انسخ الكود كما يلي: int k = 4;
لـ (int i=arr.length-1; i>=arr.length-k; i--) {
System.out.println(arr[i]+" ");
}
. الحل الأول جيد بالفعل، ولكن هل هناك طريقة أفضل؟
الجواب هو نعم! يمكننا اختيار الفرز الجزئي، ومن ثم نستخدم الفرز الاختياري لحل هذه المشكلة.
الرمز هو كما يلي:
انسخ الكود كما يلي: public static int[] SelectSortK(int[] arr, int k) {
إذا (arr == null || arr.length == 0) {
عودة فارغة؛
}
int[] newArr = new int[k];
List<Integer> list = new ArrayList<Integer>();// سجل الحد الأقصى للرقم في كل مرة
لـ (int i=0; i<k; i++) {
int maxValue = Integer.MIN_VALUE; //القيمة القصوى
int maxIndex = i;
for (int j=0; j<arr.length; j++) {
إذا (arr[j] > maxValue && !list.contains(j) ) {
maxValue = arr[j];
maxIndex = j;
}
}
if (!list.contains(maxIndex)) {// إذا لم يكن موجودًا، قم بإضافته
list.add(maxIndex);
newArr[i] = maxValue;
}
}
إرجاع newArr؛
}