package com.interview.sort;
import java.util.Deque;
import java.util.LinkedList;
/**
* http://www.geeksforgeeks.org/iterative-quick-sort/
* Test case
* 0,1 or more elements in the array
*/
public class IterativeQuickSort {
public void sort(int arr[]){
Deque<Integer> stack = new LinkedList<Integer>();
int l = 0;
int h = arr.length-1;
stack.offerFirst(l);
stack.offerFirst(h);
while(!stack.isEmpty()){
h = stack.pollFirst();
l = stack.pollFirst();
int p = partition(arr,l,h);
if(l < p-1 && h > p+1){
stack.offerFirst(l);
stack.offerFirst(p-1);
stack.offerFirst(p+1);
stack.offerFirst(h);
}
else if(l < p-1){
stack.offerFirst(l);
stack.offerFirst(p-1);
}else if(h > p+1){
stack.offerFirst(p+1);
stack.offerFirst(h);
}
}
}
private int partition(int arr[], int low,int high){
int pivot = arr[low];
int i = low+1;
int j = low+1;
while(j <= high){
if(arr[j] < pivot){
swap(arr,i,j);
i++;
}
j++;
}
swap(arr,i-1,low);
return i-1;
}
private void swap(int arr[],int a,int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public static void main(String args[]){
int arr[] = {3,2,8,0,11,-1,-5,4,32,-60,44};
IterativeQuickSort iqs = new IterativeQuickSort();
iqs.sort(arr);
for(int i=0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
}
}