Al igual que Merge Sort , QuickSort es un algoritmo Divide and Conquer . Selecciona un elemento como pivote y divide la array dada alrededor del pivote seleccionado. Hay muchas versiones diferentes de quickSort que seleccionan el pivote de diferentes maneras.
- Elija siempre el primer elemento como pivote.
- Elija siempre el último elemento como pivote (implementado a continuación)
- Elija un elemento aleatorio como pivote.
- Elija la mediana como pivote.
El proceso clave en QuickSort es una partición(). El objetivo de las particiones es, dado un arreglo y un elemento x de un arreglo como pivote, colocar x en su posición correcta en un arreglo ordenado y colocar todos los elementos más pequeños (menores que x) antes de x, y colocar todos los elementos mayores (mayores que x) después de x. Todo esto debe hacerse en tiempo lineal.
C++14
/* C++ implementation of QuickSort */ #include <bits/stdc++.h> using namespace std; // A utility function to swap two elements void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } /* This function takes last element as pivot, places the pivot element at its correct position in sorted array, and places all smaller (smaller than pivot) to left of pivot and all greater elements to right of pivot */ int partition (int arr[], int low, int high) { int pivot = arr[high]; // pivot int i = (low - 1); // Index of smaller element and indicates the right position of pivot found so far for (int j = low; j <= high - 1; j++) { // If current element is smaller than the pivot if (arr[j] < pivot) { i++; // increment index of smaller element swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } /* The main function that implements QuickSort arr[] --> Array to be sorted, low --> Starting index, high --> Ending index */ void quickSort(int arr[], int low, int high) { if (low < high) { /* pi is partitioning index, arr[p] is now at right place */ int pi = partition(arr, low, high); // Separately sort elements before // partition and after partition quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } /* Function to print an array */ void printArray(int arr[], int size) { int i; for (i = 0; i < size; i++) cout << arr[i] << " "; cout << endl; } // Driver Code int main() { int arr[] = {10, 7, 8, 9, 1, 5}; int n = sizeof(arr) / sizeof(arr[0]); quickSort(arr, 0, n - 1); cout << "Sorted array: \n"; printArray(arr, n); return 0; } // This code is contributed by rathbhupendra
Java
// Java implementation of QuickSort import java.io.*; class GFG{ // A utility function to swap two elements static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } /* This function takes last element as pivot, places the pivot element at its correct position in sorted array, and places all smaller (smaller than pivot) to left of pivot and all greater elements to right of pivot */ static int partition(int[] arr, int low, int high) { // pivot int pivot = arr[high]; // Index of smaller element and // indicates the right position // of pivot found so far int i = (low - 1); for(int j = low; j <= high - 1; j++) { // If current element is smaller // than the pivot if (arr[j] < pivot) { // Increment index of // smaller element i++; swap(arr, i, j); } } swap(arr, i + 1, high); return (i + 1); } /* The main function that implements QuickSort arr[] --> Array to be sorted, low --> Starting index, high --> Ending index */ static void quickSort(int[] arr, int low, int high) { if (low < high) { // pi is partitioning index, arr[p] // is now at right place int pi = partition(arr, low, high); // Separately sort elements before // partition and after partition quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } // Function to print an array static void printArray(int[] arr, int size) { for(int i = 0; i < size; i++) System.out.print(arr[i] + " "); System.out.println(); } // Driver Code public static void main(String[] args) { int[] arr = { 10, 7, 8, 9, 1, 5 }; int n = arr.length; quickSort(arr, 0, n - 1); System.out.println("Sorted array: "); printArray(arr, n); } } // This code is contributed by Ayush Choudhary
Python3
# Python3 implementation of QuickSort # Function to find the partition position def partition(array, low, high): # Choose the rightmost element as pivot pivot = array[high] # Pointer for greater element i = low - 1 # Traverse through all elements # compare each element with pivot for j in range(low, high): if array[j] <= pivot: # If element smaller than pivot is found # swap it with the greater element pointed by i i = i + 1 # Swapping element at i with element at j (array[i], array[j]) = (array[j], array[i]) # Swap the pivot element with the greater element specified by i (array[i + 1], array[high]) = (array[high], array[i + 1]) # Return the position from where partition is done return i + 1 # Function to perform quicksort def quick_sort(array, low, high): if low < high: # Find pivot element such that # element smaller than pivot are on the left # element greater than pivot are on the right pi = partition(array, low, high) # Recursive call on the left of pivot quick_sort(array, low, pi - 1) # Recursive call on the right of pivot quick_sort(array, pi + 1, high) # Driver code array = [ 10, 7, 8, 9, 1, 5] quick_sort(array, 0, len(array) - 1) print(f'Sorted array: {array}') # This code is contributed by Adnan Aliakbar
C#
// C# implementation of QuickSort using System; class GFG { // A utility function to swap two elements static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } /* This function takes last element as pivot, places the pivot element at its correct position in sorted array, and places all smaller (smaller than pivot) to left of pivot and all greater elements to right of pivot */ static int partition(int[] arr, int low, int high) { // pivot int pivot = arr[high]; // Index of smaller element and // indicates the right position // of pivot found so far int i = (low - 1); for (int j = low; j <= high - 1; j++) { // If current element is smaller // than the pivot if (arr[j] < pivot) { // Increment index of // smaller element i++; swap(arr, i, j); } } swap(arr, i + 1, high); return (i + 1); } /* The main function that implements QuickSort arr[] --> Array to be sorted, low --> Starting index, high --> Ending index */ static void quickSort(int[] arr, int low, int high) { if (low < high) { // pi is partitioning index, arr[p] // is now at right place int pi = partition(arr, low, high); // Separately sort elements before // partition and after partition quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } // Function to print an array static void printArray(int[] arr, int size) { for (int i = 0; i < size; i++) Console.Write(arr[i] + " "); Console.WriteLine(); } // Driver Code public static void Main() { int[] arr = { 10, 7, 8, 9, 1, 5 }; int n = arr.Length; quickSort(arr, 0, n - 1); Console.Write("Sorted array: "); printArray(arr, n); } } // This code is contributed by gfgking
Javascript
<script> // Javascript implementation of QuickSort // A utility function to swap two elements function swap(arr, i, j) { let temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } /* This function takes last element as pivot, places the pivot element at its correct position in sorted array, and places all smaller (smaller than pivot) to left of pivot and all greater elements to right of pivot */ function partition(arr, low, high) { // pivot let pivot = arr[high]; // Index of smaller element and // indicates the right position // of pivot found so far let i = (low - 1); for (let j = low; j <= high - 1; j++) { // If current element is smaller // than the pivot if (arr[j] < pivot) { // Increment index of // smaller element i++; swap(arr, i, j); } } swap(arr, i + 1, high); return (i + 1); } /* The main function that implements QuickSort arr[] --> Array to be sorted, low --> Starting index, high --> Ending index */ function quickSort(arr, low, high) { if (low < high) { // pi is partitioning index, arr[p] // is now at right place let pi = partition(arr, low, high); // Separately sort elements before // partition and after partition quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } // Function to print an array function printArray(arr, size) { for (let i = 0; i < size; i++) document.write(arr[i] + " "); document.write("<br>"); } // Driver Code let arr = [10, 7, 8, 9, 1, 5]; let n = arr.length; quickSort(arr, 0, n - 1); document.write("Sorted array: <br>"); printArray(arr, n); // This code is contributed by Saurabh Jaiswal </script>
C++
#include <iostream> #include <algorithm> using namespace std; int partition(int arr[], int low, int high) { int i = low; int j = high; int pivot = arr[low]; while (i < j) { while (pivot >= arr[i]) i++; while (pivot < arr[j]) j--; if (i < j) swap(arr[i], arr[j]); } swap(arr[low], arr[j]); return j; } void quickSort(int arr[], int low, int high) { if (low < high) { int pivot = partition(arr, low, high); quickSort(arr, low, pivot - 1); quickSort(arr, pivot + 1, high); } } void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { cout << arr[i] << " "; } cout << endl; } int main() { int arr[] = {4, 2, 8, 3, 1, 5, 7,11,6}; int size = sizeof(arr) / sizeof(int); cout<<"Before Sorting"<<endl; printArray(arr, size); quickSort(arr, 0, size - 1); cout<<"After Sorting"<<endl; printArray(arr, size); return 0; }
Python3
# Python3 implementation of QuickSort # Function to find the partition position def partition(arr, l, h): low, high = l, h if l != h and l < h: # Choose the leftmost element as pivot pivot = arr[l] low = low+1 # Traverse through all elements # compare each element with pivot while low <= high: if arr[high] < pivot and arr[low] > pivot: arr[high], arr[low] = arr[low], arr[high] if not arr[low] > pivot: low += 1 if not arr[high] < pivot: high -= 1 arr[l], arr[high] = arr[high], arr[l] # Return the position from where partition is done return high # Function to perform quicksort def quick_sort(array, low, high): if low < high: # Find pivot element such that # element smaller than pivot are on the left # element greater than pivot are on the right pi = partition(array, low, high) # Recursive call on the left of pivot quick_sort(array, low, pi - 1) # Recursive call on the right of pivot quick_sort(array, pi + 1, high) # Driver code array = [ 1, 7, 8, 9, 1, 2] quick_sort(array, 0, len(array) - 1) print(f'Sorted array: {array}') # This code is contributed by Adnan Aliakbar
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA