public class SortAlgorithm {
public static void main(String[] args) {
// TODO Auto-generated method stub
SortAlgorithm sa = new SortAlgorithm();
// int[] arr = {4,7,2,4,3,9,0,10};
int[] arr = { 8, 5, 3, 6, 1, 9, 4, 3 };
int len = arr.length;
// sa.quickSort(arr, 0, len-1);
// sa.heapSort(arr);
// sa.bubbleSort1(arr);
// sa.bubbleSort2(arr);
// sa.selectSort(arr);
// sa.quickSort(arr, 0, len-1);
// sa.shellSort(arr);
// sa.BSort(arr);
sa.MergeSort(arr, 0, len - 1);
sa.printArr(arr);
}
/*
* Quick Sort
*/
public void quickSort(int[] arr, int left, int right) {
int index = partion(arr, left, right);
if (left < index - 1) {
quickSort(arr, left, index - 1);
}
if (index < right) {
quickSort(arr, index, right);
}
}
private int partion(int[] arr, int left, int right) {
int pivot = arr[(left + right) / 2];
while (left <= right) {
while (arr[left] < pivot) {
++left;
}
while (arr[right] > pivot) {
--right;
}
if (left <= right) {
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
++left;
--right;
}
}
return left;
}
/*
* Quick Sort2
*/
public void quickSort2(int[] arr, int left, int right) {
if (left >= right)
return;
int key = arr[left];
int i = left;
int j = right + 1;
while (i < j) {
++i;
while (arr[i] < key) {
++i;
}
--j;
while (arr[j] > key) {
--j;
}
if (i < j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
int tmp = arr[left];
arr[left] = arr[j];
arr[j] = tmp;
quickSort2(arr, left, j - 1);
quickSort2(arr, j + 1, right);
}
/*
* Heap Sort
*/
public void heapSort(int[] arr) {
int len = arr.length;
for (int i = len; i >= 1; --i) {
buildHeap(arr, i);
int tmp = arr[0];
arr[0] = arr[i - 1];
arr[i - 1] = tmp;
}
}
private void buildHeap(int[] arr, int len) {
for (int i = len; i >= 0; --i) {
swap(arr, i, len);
}
}
private void swap(int[] arr, int p, int len) {
int maxt = p;
int left = 2 * p + 1;
if (left < len && arr[left] > arr[maxt]) {
maxt = left;
}
int right = 2 * p + 2;
if (right < len && arr[right] > arr[maxt]) {
maxt = right;
}
if (maxt != p) {
int tmp = arr[p];
arr[p] = arr[maxt];
arr[maxt] = tmp;
swap(arr, maxt, len);
}
}
/*
* Bubble Sort
*/
public void bubbleSort1(int[] arr) {
int len = arr.length;
int upperBound = len - 1;
for (int i = 0; i < len; ++i) {
int t = 0;
for (int j = 0; j < len - i - 1 && j < upperBound; ++j) {
if (arr[j] > arr[j + 1]) {
t = j;
swapTwo(arr, j, j + 1);
}
}
upperBound = t;
}
}
public void bubbleSort2(int[] arr) {
int len = arr.length;
int upperBound = len - 1;
while (upperBound > 0) {
int t = 0;
for (int i = 0; i < upperBound; ++i) {
if (arr[i] > arr[i + 1]) {
t = i;
swapTwo(arr, i, i + 1);
}
}
upperBound = t;
}
}
public void swapTwo(int[] arr, int left, int right) {
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
/*
* Select Sort
*/
public void selectSort(int[] arr) {
int len = arr.length;
for (int j = len - 1; j >= 1; --j) {
int t = 0;
for (int i = 1; i <= j; ++i) {
if (arr[t] < arr[i]) {
t = i;
}
}
swapTwo(arr, t, j);
}
}
/*
* Insert Sort
*/
public void insertSort(int[] arr) {
int len = arr.length;
for (int i = 1; i < len; ++i) {
int t = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > t) {
arr[j + 1] = arr[j];
--j;
}
arr[j + 1] = t;
}
}
/*
* Shell Sort
*/
public void shellSort(int[] arr) {
int len = arr.length;
int i = 0;
int j = 0;
for (int h = len / 2; h > 0; h /= 2) {
for (i = h; i < len; ++i) {
int tmp = arr[i];
for (j = i - h; j >= 0; j -= h) {
if (arr[j] > tmp) {
arr[j + h] = arr[j];
} else {
break;
}
}
arr[j + h] = tmp;
}
}
}
/*
* Merge Sort
*/
public void MergeSort(int[] arr, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
MergeSort(arr, left, mid);
MergeSort(arr, mid + 1, right);
Merge(arr, left, mid, right);
}
}
private void Merge(int[] arr, int left, int mid, int right) {
int[] tmp = new int[arr.length];
int p = left;
int q = mid + 1;
int index = left;
while (p <= mid && q <= right) {
if (arr[p] < arr[q]) {
tmp[index++] = arr[p++];
} else {
tmp[index++] = arr[q++];
}
}
while (p <= mid) {
tmp[index++] = arr[p++];
}
while (q <= right) {
tmp[index++] = arr[q++];
}
for (int i = left; i <= right; ++i) {
arr[i] = tmp[i];
}
}
public void swapArr(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public void printArr(int[] arr) {
int len = arr.length;
for (int i = 0; i < len; ++i) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}