クイックセレクト (Quickselect)
C
#include <stdio.h>
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int arr[], int left, int right) {
int pivot = arr[right];
int i = left - 1;
for (int j = left; j < right; j++) {
if (arr[j] <= pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[right]);
return i + 1;
}
int quickSelect(int arr[], int left, int right, int k) {
if (left == right) {
return arr[left];
}
int pivotIndex = partition(arr, left, right);
if (k == pivotIndex) {
return arr[k];
} else if (k < pivotIndex) {
return quickSelect(arr, left, pivotIndex - 1, k);
} else {
return quickSelect(arr, pivotIndex + 1, right, k);
}
}
int main() {
int arr[] = {12, 3, 5, 7, 4, 19, 26};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 3;
printf("Kth smallest element is %d\n", quickSelect(arr, 0, n - 1, k - 1));
return 0;
}
C++
#include <iostream>
using namespace std;
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int arr[], int left, int right) {
int pivot = arr[right];
int i = left - 1;
for (int j = left; j < right; j++) {
if (arr[j] <= pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[right]);
return i + 1;
}
int quickSelect(int arr[], int left, int right, int k) {
if (left == right) {
return arr[left];
}
int pivotIndex = partition(arr, left, right);
if (k == pivotIndex) {
return arr[k];
} else if (k < pivotIndex) {
return quickSelect(arr, left, pivotIndex - 1, k);
} else {
return quickSelect(arr, pivotIndex + 1, right, k);
}
}
int main() {
int arr[] = {12, 3, 5, 7, 4, 19, 26};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 3;
cout << "Kth smallest element is " << quickSelect(arr, 0, n - 1, k - 1) << endl;
return 0;
}
C#
using System;
class Program {
static void Swap(ref int a, ref int b) {
int temp = a;
a = b;
b = temp;
}
static int Partition(int[] arr, int left, int right) {
int pivot = arr[right];
int i = left - 1;
for (int j = left; j < right; j++) {
if (arr[j] <= pivot) {
i++;
Swap(ref arr[i], ref arr[j]);
}
}
Swap(ref arr[i + 1], ref arr[right]);
return i + 1;
}
static int QuickSelect(int[] arr, int left, int right, int k) {
if (left == right) {
return arr[left];
}
int pivotIndex = Partition(arr, left, right);
if (k == pivotIndex) {
return arr[k];
} else if (k < pivotIndex) {
return QuickSelect(arr, left, pivotIndex - 1, k);
} else {
return QuickSelect(arr, pivotIndex + 1, right, k);
}
}
static void Main() {
int[] arr = {12, 3, 5, 7, 4, 19, 26};
int k = 3;
Console.WriteLine("Kth smallest element is " + QuickSelect(arr, 0, arr.Length - 1, k - 1));
}
}
Java
public class QuickSelect {
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static int partition(int[] arr, int left, int right) {
int pivot = arr[right];
int i = left - 1;
for (int j = left; j < right; j++) {
if (arr[j] <= pivot) {
i++;
swap(arr, i, j);
}
}
swap(arr, i + 1, right);
return i + 1;
}
public static int quickSelect(int[] arr, int left, int right, int k) {
if (left == right) {
return arr[left];
}
int pivotIndex = partition(arr, left, right);
if (k == pivotIndex) {
return arr[k];
} else if (k < pivotIndex) {
return quickSelect(arr, left, pivotIndex - 1, k);
} else {
return quickSelect(arr, pivotIndex + 1, right, k);
}
}
public static void main(String[] args) {
int[] arr = {12, 3, 5, 7, 4, 19, 26};
int k = 3;
System.out.println("Kth smallest element is " + quickSelect(arr, 0, arr.length - 1, k - 1));
}
}
Python
def partition(arr, left, right):
pivot = arr[right]
i = left - 1
for j in range(left, right):
if arr[j] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[right] = arr[right], arr[i + 1]
return i + 1
def quick_select(arr, left, right, k):
if left == right:
return arr[left]
pivot_index = partition(arr, left, right)
if k == pivot_index:
return arr[k]
elif k < pivot_index:
return quick_select(arr, left, pivot_index - 1, k)
else:
return quick_select(arr, pivot_index + 1, right, k)
arr = [12, 3, 5, 7, 4, 19, 26]
k = 3
print(f"Kth smallest element is {quick_select(arr, 0, len(arr) - 1, k - 1)}")
JavaScript
function swap(arr, i, j) {
const temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
function partition(arr, left, right) {
const pivot = arr[right];
let i = left - 1;
for (let j = left; j < right; j++) {
if (arr[j] <= pivot) {
i++;
swap(arr, i, j);
}
}
swap(arr, i + 1, right);
return i + 1;
}
function quickSelect(arr, left, right, k) {
if (left === right) {
return arr[left];
}
const pivotIndex = partition(arr, left, right);
if (k === pivotIndex) {
return arr[k];
} else if (k < pivotIndex) {
return quickSelect(arr, left, pivotIndex - 1, k);
} else {
return quickSelect(arr, pivotIndex + 1, right, k);
}
}
const arr = [12, 3, 5, 7, 4, 19, 26];
const k = 3;
console.log(`Kth smallest element is ${quickSelect(arr, 0, arr.length - 1, k - 1)}`);
この記事が気に入ったらサポートをしてみませんか?