Example 1: how to get all permutations of an array
/* to be used something like this:
int [] toBePermuted = new int [] {1, 2, 3, 4};
ArrayList<int[]> a = heap(toBePermuted);
any mention of int [] can be replaced with any other Array of objects */
ArrayList<int []> heap(int [] input) {
ArrayList<int []> ret = new ArrayList<int []> ();
ret = generate(input.length, input, ret);
return ret;
}
ArrayList<int []> generate(int k, int [] a, ArrayList<int []> output) {
if (k == 1) {
output.add(a.clone());
} else {
output = generate(k-1, a, output);
for (int i=0; i<k-1; i++) {
if (k%2 == 0) {
int temp = a[i];
a[i] = a[k-1];
a[k-1] = temp;
} else {
int temp = a[0];
a[0] = a[k-1];
a[k-1] = temp;
}
generate(k-1, a, output);
}
}
return output;
}
Example 2: heapsort
Implementation of heap sort in C++:
using namespace std;
// To heapify a subtree rooted with node i which is
// Heapify:- A process which helps regaining heap properties in tree after removal
void heapify(int A[], int n, int i)
{
int largest = i; // Initialize largest as root
int left_child = 2 * i + 1; // left = 2*i + 1
int right_child = 2 * i + 2; // right = 2*i + 2
// If left child is larger than root
if (left_child < n && A[left_child] > A[largest])
largest = left_child;
// If right child is larger than largest so far
if (right_child < n && A[right_child] > A[largest])
largest = right_child;
// If largest is not root
if (largest != i) {
swap(A[i], A[largest]);
// Recursively heapify the affected sub-tree
heapify(A, n, largest);
}
}
// main function to do heap sort
void heap_sort(int A[], int n)
{
// Build heap (rearrange array)
for (int i = n / 2 - 1; i >= 0; i--)
heapify(A, n, i);
// One by one extract an element from heap
for (int i = n - 1; i >= 0; i--) {
// Move current root to end
swap(A[0], A[i]);
// call max heapify on the reduced heap
heapify(A, i, 0);
}
}
/* A function to print sorted Array */
void printArray(int A[], int n)
{
for (int i = 0; i < n; ++i)
cout << A[i] << " ";
cout << "\n";
}
// Driver program
int main()
{
int A[] = { 22, 19, 3, 25, 26, 7 }; // array to be sorted
int n = sizeof(A) / sizeof(A[0]); // n is size of array
heap_sort(A, n);
cout << "Sorted array is \n";
printArray(A, n);
}
Example 3: heapsort
using namespace std;
void swap(int*,int*);
void heapify(int arr[],int n,int index)
{
int left=2*index+1;
int right=left+1;
int max=index;
if(left<n&&arr[left]>arr[max])
{
max=left;
}
if(right<n&&arr[right]>arr[max])
{
max=right;
}
if(index!=max)
{
swap(&arr[index],&arr[max]);
heapify(arr,n,max);
}
}
void buildheap(int arr[],int n)
{
for(int i=(n/2);i>=0;i--)
{
heapify(arr,n,i);
}
}
void heapsort(int arr[],int n)
{
buildheap(arr,n);
int l=n-1;
while(l>0)
{
swap(&arr[0],&arr[l]);
l--;
n--;
heapify(arr,n,0);
}
}
void disp(int arr[],int n)
{
for(int i=0;i<n;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
int main()
{
int n;
cout<<"enter the size of the array:"<<endl;
cin>>n;
int a[n];
cout<<"enter the elements of the array:"<<endl;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
cout<<"array before sorting:"<<endl;
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
//buildheap(a,n);
//disp(a,n);
cout<<"array after sorting:"<<endl;
heapsort(a,n);
disp(a,n);
return 0;
}
void swap(int*a,int*b)
{
int temp=*a;
*a=*b;
*b=temp;
}