public class sort {
public static void merge(int[] src1, int start1, int len1, int[] src2, int start2, int len2, int[] dest, int start ) {
int i = start1;
int j = start2;
int k = 0;
int[] tmp = new int[len1 + len2];
while (i < start1 + len1 && j < start2 + len2) {
if (src1[i] < src2[j]) {
tmp[k++] = src1[i++];
}
else
tmp[k++] = src2[j++];
}
while (i < start1 + len1) {
tmp[k++] = src1[i++];
}
while (j < start2 + len2) {
tmp[k++] = src2[j++];
}
for (int l : tmp) {
dest[start++] = l;
}
}
public static void recMerge(int dest[], int start, int len ) {
int size = len / 2;
if (len <= 1)
return;
recMerge(dest, start, size);
recMerge(dest, start + size, len - size);
merge(dest, start, size, dest, start + size, len - size, dest, start);
}
public static void iterMerge(int[] dest) {
int gap = 1;
int len = dest.length;
int i;
while (gap < len) {
for (i = 0; i <= len - gap * 2; i += gap * 2) {
merge(dest, i, gap, dest, i + gap, gap, dest, i);
}
if (len - i > gap)
merge(dest, i, gap, dest, i + gap, len - i - gap, dest, i);
gap = gap * 2;
}
}
public static void quickSort(int dest[], int start, int len) {
int i = start;
int j = len - 1 + start;
int flag = 0;
int tmp;
if (len <= 0)
return;
while (i < j) {
if (dest[i] > dest[j]) {
tmp = dest[i];
dest[i] = dest[j];
dest[j] = tmp;
flag = 1 - flag;
}
if (flag == 0)
i++;
else
j--;
quickSort(dest, start, i - start);
quickSort(dest, i, len - (i - start));
}
}
public static void adjustHeap(int[] data, int i, int len) {
int l = i * 2 + 1;
int r = i * 2 + 2;
int large;
if (l < len && data[l] > data[i])
large = l;
else
large = i;
if (r < len && data[r] > data[large])
large = r;
// else
// large = i;
if (large != i) {
int tmp;
tmp = data[i];
data[i] = data[large];
data[large] = tmp;
adjustHeap(data, large, len);
}
}
public static void heapSort(int[] data) {
int i;
int len = data.length;
for (i = len / 2; i >= 0; i--) {
adjustHeap(data, i, len);
}
for (i = len - 1; i >= 0; i--) {
int tmp;
tmp = data[0];
data[0] = data[i];
data[i] = tmp;
len--;
adjustHeap(data, 0, len);
}
}
public static void main(String[] args) {
int[] dest = {3, 4, 6, 8, 100, 9, 22, 56, 89, 66};
recMerge(dest, 0, dest.length);
iterMerge(dest);
quickSort(dest, 0, dest.length);
heapSort(dest);
for (int i : dest) {
System.out.print(i + " ");
}
}
}
public static void merge(int[] src1, int start1, int len1, int[] src2, int start2, int len2, int[] dest, int start ) {
int i = start1;
int j = start2;
int k = 0;
int[] tmp = new int[len1 + len2];
while (i < start1 + len1 && j < start2 + len2) {
if (src1[i] < src2[j]) {
tmp[k++] = src1[i++];
}
else
tmp[k++] = src2[j++];
}
while (i < start1 + len1) {
tmp[k++] = src1[i++];
}
while (j < start2 + len2) {
tmp[k++] = src2[j++];
}
for (int l : tmp) {
dest[start++] = l;
}
}
public static void recMerge(int dest[], int start, int len ) {
int size = len / 2;
if (len <= 1)
return;
recMerge(dest, start, size);
recMerge(dest, start + size, len - size);
merge(dest, start, size, dest, start + size, len - size, dest, start);
}
public static void iterMerge(int[] dest) {
int gap = 1;
int len = dest.length;
int i;
while (gap < len) {
for (i = 0; i <= len - gap * 2; i += gap * 2) {
merge(dest, i, gap, dest, i + gap, gap, dest, i);
}
if (len - i > gap)
merge(dest, i, gap, dest, i + gap, len - i - gap, dest, i);
gap = gap * 2;
}
}
public static void quickSort(int dest[], int start, int len) {
int i = start;
int j = len - 1 + start;
int flag = 0;
int tmp;
if (len <= 0)
return;
while (i < j) {
if (dest[i] > dest[j]) {
tmp = dest[i];
dest[i] = dest[j];
dest[j] = tmp;
flag = 1 - flag;
}
if (flag == 0)
i++;
else
j--;
quickSort(dest, start, i - start);
quickSort(dest, i, len - (i - start));
}
}
public static void adjustHeap(int[] data, int i, int len) {
int l = i * 2 + 1;
int r = i * 2 + 2;
int large;
if (l < len && data[l] > data[i])
large = l;
else
large = i;
if (r < len && data[r] > data[large])
large = r;
// else
// large = i;
if (large != i) {
int tmp;
tmp = data[i];
data[i] = data[large];
data[large] = tmp;
adjustHeap(data, large, len);
}
}
public static void heapSort(int[] data) {
int i;
int len = data.length;
for (i = len / 2; i >= 0; i--) {
adjustHeap(data, i, len);
}
for (i = len - 1; i >= 0; i--) {
int tmp;
tmp = data[0];
data[0] = data[i];
data[i] = tmp;
len--;
adjustHeap(data, 0, len);
}
}
public static void main(String[] args) {
int[] dest = {3, 4, 6, 8, 100, 9, 22, 56, 89, 66};
recMerge(dest, 0, dest.length);
iterMerge(dest);
quickSort(dest, 0, dest.length);
heapSort(dest);
for (int i : dest) {
System.out.print(i + " ");
}
}
}