Heap Sort क्या है
In this page:
def heapify(arr, n, i):
largest = i
left, right = 2 * i + 1, 2 * i + 2
if left < n and arr[left] > arr[largest]:
largest = left
if right < n and arr[right] > arr[largest]:
largest = right
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
for i in range(n // 2 - 1, -1, -1):
heapify(arr, n, i)
for end in range(n - 1, 0, -1):
arr[0], arr[end] = arr[end], arr[0]
heapify(arr, end, 0)
Basic Idea
Heap sort पहले array को एक max heap में rearrange करता है, जहां हर parent value इसके children से कम से कम उतनी बड़ी है, फिर top से सबसे बड़ी value बार-बार हटाता है और इसे array के आखिर में रखता है जब तक कुछ न बचे।
उदाहरण: Basic Idea
#include <iostream>
using namespace std;
void heapify(int arr[], int n, int i) {
int largest = i, l = 2 * i + 1, r = 2 * i + 2;
if (l < n && arr[l] > arr[largest]) largest = l;
if (r < n && arr[r] > arr[largest]) largest = r;
if (largest != i) { swap(arr[i], arr[largest]); heapify(arr, n, largest); }
}
void heapSort(int arr[], int n) {
for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i);
for (int i = n - 1; i > 0; i--) { swap(arr[0], arr[i]); heapify(arr, i, 0); }
}
int main() {
int arr[] = {4, 10, 3, 5, 1};
heapSort(arr, 5);
for (int x : arr) cout << x << " ";
return 0;
}
public class Main {
static void heapify(int[] arr, int n, int i) {
int largest = i, l = 2 * i + 1, r = 2 * i + 2;
if (l < n && arr[l] > arr[largest]) largest = l;
if (r < n && arr[r] > arr[largest]) largest = r;
if (largest != i) { int t = arr[i]; arr[i] = arr[largest]; arr[largest] = t; heapify(arr, n, largest); }
}
static void heapSort(int[] arr, int n) {
for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i);
for (int i = n - 1; i > 0; i--) { int t = arr[0]; arr[0] = arr[i]; arr[i] = t; heapify(arr, i, 0); }
}
public static void main(String[] args) {
int[] arr = {4, 10, 3, 5, 1};
heapSort(arr, 5);
System.out.println(java.util.Arrays.toString(arr));
}
}
def heapify(arr, n, i):
largest = i
l, r = 2 * i + 1, 2 * i + 2
if l < n and arr[l] > arr[largest]:
largest = l
if r < n and arr[r] > arr[largest]:
largest = r
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
def heap_sort(arr):
n = len(arr)
for i in range(n // 2 - 1, -1, -1):
heapify(arr, n, i)
for i in range(n - 1, 0, -1):
arr[0], arr[i] = arr[i], arr[0]
heapify(arr, i, 0)
arr = [4, 10, 3, 5, 1]
heap_sort(arr)
print(arr)
#include <stdio.h>
void swapv(int *a, int *b) { int t = *a; *a = *b; *b = t; }
void heapify(int arr[], int n, int i) {
int largest = i, l = 2 * i + 1, r = 2 * i + 2;
if (l < n && arr[l] > arr[largest]) largest = l;
if (r < n && arr[r] > arr[largest]) largest = r;
if (largest != i) { swapv(&arr[i], &arr[largest]); heapify(arr, n, largest); }
}
void heapSort(int arr[], int n) {
for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i);
for (int i = n - 1; i > 0; i--) { swapv(&arr[0], &arr[i]); heapify(arr, i, 0); }
}
int main() {
int arr[] = {4, 10, 3, 5, 1};
heapSort(arr, 5);
for (int i = 0; i < 5; i++) printf("%d ", arr[i]);
return 0;
}
Login to try C/C++/Java code in the editor
Step by Step
Heap बनाना और इसका maximum हटाना दोनों उसी 'sift down' operation से किए जाते हैं: root हटाने के बाद, आखिरी element इसकी जगह लेता है और इसके बड़े child के साथ नीचे की ओर swap होता रहता है जब तक heap property restore न हो जाए।
उदाहरण: Step by Step
#include <iostream>
using namespace std;
int main() {
cout << "Build max heap first, then repeatedly swap root (max) to the end and sift down the reduced heap";
return 0;
}
public class Main {
public static void main(String[] args) {
System.out.println("Build max heap first, then repeatedly swap root (max) to the end and sift down the reduced heap");
}
}
print("Build max heap first, then repeatedly swap root (max) to the end and sift down the reduced heap")
#include <stdio.h>
int main() {
printf("Build max heap first, then repeatedly swap root (max) to the end and sift down the reduced heap");
return 0;
}
Login to try C/C++/Java code in the editor
Small Array
[4, 10, 3, 5, 1] जैसे एक छोटे array पर heap sort trace करना initial heap-building phase के बाद repeated root-removal steps दिखाता है, हर एक heap को एक से छोटा करते हुए और array के आखिर में sorted हिस्से को बढ़ाते हुए।
उदाहरण: Small Array
#include <iostream>
using namespace std;
void heapify(int arr[], int n, int i) {
int largest = i, l = 2 * i + 1, r = 2 * i + 2;
if (l < n && arr[l] > arr[largest]) largest = l;
if (r < n && arr[r] > arr[largest]) largest = r;
if (largest != i) { swap(arr[i], arr[largest]); heapify(arr, n, largest); }
}
int main() {
int arr[] = {4, 10, 3, 5, 1};
for (int i = 1 / 2 - 1; i >= 0; i--) heapify(arr, 5, i);
heapify(arr, 5, 0);
for (int x : arr) cout << x << " ";
return 0;
}
public class Main {
static void heapify(int[] arr, int n, int i) {
int largest = i, l = 2 * i + 1, r = 2 * i + 2;
if (l < n && arr[l] > arr[largest]) largest = l;
if (r < n && arr[r] > arr[largest]) largest = r;
if (largest != i) { int t = arr[i]; arr[i] = arr[largest]; arr[largest] = t; heapify(arr, n, largest); }
}
public static void main(String[] args) {
int[] arr = {4, 10, 3, 5, 1};
heapify(arr, 5, 0);
System.out.println(java.util.Arrays.toString(arr));
}
}
def heapify(arr, n, i):
largest = i
l, r = 2 * i + 1, 2 * i + 2
if l < n and arr[l] > arr[largest]:
largest = l
if r < n and arr[r] > arr[largest]:
largest = r
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
arr = [4, 10, 3, 5, 1]
heapify(arr, 5, 0)
print(arr)
#include <stdio.h>
void swapv(int *a, int *b) { int t = *a; *a = *b; *b = t; }
void heapify(int arr[], int n, int i) {
int largest = i, l = 2 * i + 1, r = 2 * i + 2;
if (l < n && arr[l] > arr[largest]) largest = l;
if (r < n && arr[r] > arr[largest]) largest = r;
if (largest != i) { swapv(&arr[i], &arr[largest]); heapify(arr, n, largest); }
}
int main() {
int arr[] = {4, 10, 3, 5, 1};
heapify(arr, 5, 0);
for (int i = 0; i < 5; i++) printf("%d ", arr[i]);
return 0;
}
Login to try C/C++/Java code in the editor
Practice
Merge sort के विपरीत, heap sort को किसी extra array की ज़रूरत नहीं — heap और बढ़ता sorted region दोनों original array के अंदर ही रहते हैं, यही कारण है कि heap sort को memory tight होने पर value दी जाती है भले ही यह practice में एक well-tuned quicksort से आमतौर पर थोड़ा धीमा हो।
उदाहरण: Practice
#include <iostream>
using namespace std;
int main() {
cout << "Unlike merge sort, heap sort needs no extra array; the heap and sorted region share the original array";
return 0;
}
public class Main {
public static void main(String[] args) {
System.out.println("Unlike merge sort, heap sort needs no extra array; the heap and sorted region share the original array");
}
}
print("Unlike merge sort, heap sort needs no extra array; the heap and sorted region share the original array")
#include <stdio.h>
int main() {
printf("Unlike merge sort, heap sort needs no extra array; the heap and sorted region share the original array");
return 0;
}
Login to try C/C++/Java code in the editor
Summary
Heap sort हर case में O(n log n) time की गारंटी देता है, सिर्फ O(1) extra space के साथ, इसे merge sort के guaranteed time (लेकिन extra memory) और quicksort की average speed (लेकिन worst-case risk) के बीच एक reliable middle ground बनाते हुए।
उदाहरण: Summary
#include <iostream>
using namespace std;
int main() {
cout << "Heap sort: guaranteed O(n log n) time with only O(1) extra space";
return 0;
}
public class Main {
public static void main(String[] args) {
System.out.println("Heap sort: guaranteed O(n log n) time with only O(1) extra space");
}
}
print("Heap sort: guaranteed O(n log n) time with only O(1) extra space")
#include <stdio.h>
int main() {
printf("Heap sort: guaranteed O(n log n) time with only O(1) extra space");
return 0;
}
Login to try C/C++/Java code in the editor
- Heap build
n / 2 - 1के बजाय indexn - 1पर शुरू करना, leaves पर अनावश्यक काम करते हुए। - गलत child formulas उपयोग करना, जैसे
2 * iऔर2 * i + 1, एक zero-indexed array में। - हर swap के बाद shrinking size के बजाय पूरे size
nपरheapifycall करना, इसलिए sorted tail disturb होती है।
Chapter Quiz — Complete all 9 topics to unlock
0/9 topics done
Complete these topics first: