#include <iostream>
using namespace std;


int partition(int arr[], int start, int end) {
	int pivot = arr[start];
 
	int count = 0;
	for (int i = start + 1; i <= end; i++) {
		if (arr[i] <= pivot){
			count++;
		}
	}
 
	// Giving pivot element its correct position
	int pivotIndex = start + count;
	swap(arr[pivotIndex], arr[start]);
 
	// Sorting left and right parts of the pivot element
	int i = start, j = end;
 
	while (i < pivotIndex && j > pivotIndex) {
		while (arr[i] <= pivot) {
			// Find index of the first element from left that is higher than pivot
			i++;
		}
 
		while (arr[j] > pivot) {
			// Find index of the first element from right that is lower than pivot
			j--;
		}
 
		if (i < pivotIndex && j > pivotIndex) {
			swap(arr[i], arr[j]);
			i++;
			j--;
		}
	}
 
	return pivotIndex;
}


void quickSort(int arr[], int low, int high) {
	if (low < high) {
		int pi = partition(arr, low, high);

		quickSort(arr, low, pi - 1);
		quickSort(arr, pi + 1, high);
	}
}
// 4 1 3 5 2
// 5 1 3 4 2
// 2 1 3 4 5
// 1 2 3 4 5



int main() {
	int N = 50;
	int arr[N];
	for (int i = 0; i < N; i++) {
		arr[i] = N - i;
	}

	quickSort(arr, 0, N - 1);

	for (int i = 0; i < N; i++) {
		cout << arr[i] << " ";
	}
	cout << endl;
	return 0;
}