前言
經過兩個月的各種筆試面試,對各種基礎排序算法原理了然於胸,用c閉着眼都能寫出完美ac的代碼來,今天剛看完java的數組,忍不住用java將各種排序實現一遍
注意,這篇文章只是爲了鍛鍊java語法,不會深入講各種排序原理,有興趣的同學可以看我之前的博客,各自排序我都用c講的非常清楚了
冒泡排序
-
public static void bubbleSort(int A[], int n) {
-
int i, j;
-
-
for (i = 0; i < n - 1; i ++) {
-
for (j = 0; j < n - i - 1; j ++) {
-
if (A[j] > A[j + 1]) {
-
A[j] = A[j] ^ A[j + 1];
-
A[j + 1] = A[j] ^ A[j + 1];
-
A[j] = A[j] ^ A[j + 1];
-
}
-
}
-
}
-
}
直接插入排序
-
public static void insertSort(int A[], int n) {
-
int i, j, tmp;
-
-
for (i = 1; i < n; i++) {
-
tmp = A[i];
-
-
for (j = i - 1; j >= 0; j--) {
-
if (A[j] > tmp) {
-
A[j + 1] = A[j];
-
} else {
-
break;
-
}
-
}
-
-
A[j + 1] = tmp;
-
}
-
}
直接選擇排序
-
public static void selectSort(int A[], int n) {
-
int i, j, loc;
-
-
for (i = 0; i < n; i++) {
-
loc = i;
-
-
for (j = i + 1; j < n; j++) {
-
if (A[j] < A[loc]) {
-
loc = j;
-
}
-
}
-
-
if (loc != i) {
-
A[i] = A[i] ^ A[loc];
-
A[loc] = A[i] ^ A[loc];
-
A[i] = A[i] ^ A[loc];
-
}
-
}
-
}
堆排序
-
-
-
-
-
-
-
public static void heapSort(int A[], int n) {
-
int tmp;
-
-
-
buildMaxHeap(A, n);
-
-
for (int j = n - 1; j >= 1; j--) {
-
tmp = A[0];
-
A[0] = A[j];
-
A[j] = tmp;
-
-
maxheapIfy(A, 0, j);
-
}
-
}
-
-
-
-
-
-
-
-
private static void buildMaxHeap(int A[], int n) {
-
for (int i = (n - 2) / 2; i >= 0; i--) {
-
maxheapIfy(A, i, n);
-
}
-
}
-
-
-
-
-
-
-
-
-
private static void maxheapIfy(int A[], int i, int n) {
-
int left, right, loc;
-
-
while (i < n) {
-
left = 2 * i + 1;
-
right = 2 * i + 2;
-
loc = i;
-
-
if (left < n && A[left] > A[i]) {
-
i = left;
-
}
-
-
if (right < n && A[right] > A[i]) {
-
i = right;
-
}
-
-
if (loc != i) {
-
A[i] = A[loc] ^ A[i];
-
A[loc] = A[loc] ^ A[i];
-
A[i] = A[loc] ^ A[i];
-
} else {
-
break;
-
}
-
}
-
}
快速排序
-
public static void quickSort(int A[], int bt, int ed) {
-
if (bt < ed) {
-
int pivot = pivotPartition(A, bt, ed);
-
-
quickSort(A, bt, pivot - 1);
-
-
quickSort(A, pivot + 1, ed);
-
}
-
}
-
-
private static void swapVar(int A[], int bt, int ed) {
-
int mid = bt + (ed - bt) / 2;
-
-
if (mid != bt) {
-
A[bt] = A[bt] ^ A[mid];
-
A[mid] = A[bt] ^ A[mid];
-
A[bt] = A[bt] ^ A[mid];
-
}
-
}
-
-
private static int pivotPartition(int A[], int bt, int ed) {
-
-
swapVar(A, bt, ed);
-
-
int stand = A[bt];
-
-
while (bt < ed) {
-
while (bt < ed && A[ed] >= stand) {
-
ed--;
-
}
-
if (bt < ed) {
-
A[bt++] = A[ed];
-
}
-
-
while (bt < ed && A[bt] <= stand) {
-
bt++;
-
}
-
if (bt < ed) {
-
A[ed--] = A[bt];
-
}
-
}
-
-
A[bt] = stand;
-
-
return bt;
-
}
歸併排序
-
public static void mergeSort(int A[], int bt, int ed) {
-
if (bt < ed) {
-
int mid = bt + (ed - bt) / 2;
-
-
mergeSort(A, bt, mid);
-
-
mergeSort(A, mid + 1, ed);
-
-
mergeArray(A, bt, mid, ed);
-
}
-
}
-
-
private static void mergeArray(int A[], int bt, int mid, int ed) {
-
int i, j, k, len = ed - bt + 1;
-
int tmp[] = new int[len];
-
-
for (i = bt, j = mid + 1, k = 0; i <= mid && j <= ed; k++) {
-
if (A[i] <= A[j]) {
-
tmp[k] = A[i++];
-
} else {
-
tmp[k] = A[j++];
-
}
-
}
-
-
while (i <= mid) {
-
tmp[k++] = A[i++];
-
}
-
-
while (j <= ed) {
-
tmp[k++] = A[j++];
-
}
-
-
for (i = 0; i < k; i++) {
-
A[bt + i] = tmp[i];
-
}
-
}
測試程序
-
import java.util.Scanner;
-
-
public class JavaSort {
-
public static void main(String args[]) {
-
Scanner cin = new Scanner(System.in);
-
-
int A[], n;
-
-
while (cin.hasNext()) {
-
n = cin.nextInt();
-
A = new int[n];
-
-
for (int i = 0; i < n; i++) {
-
A[i] = cin.nextInt();
-
}
-
-
-
-
-
-
-
-
-
-
-
-
mergeSort(A, 0, n - 1);
-
-
printArr(A);
-
}
-
}
-
-
-
-
-
-
-
-
-
public static void mergeSort(int A[], int bt, int ed) {
-
if (bt < ed) {
-
int mid = bt + (ed - bt) / 2;
-
-
mergeSort(A, bt, mid);
-
-
mergeSort(A, mid + 1, ed);
-
-
mergeArray(A, bt, mid, ed);
-
}
-
}
-
-
-
-
-
-
-
-
-
-
private static void mergeArray(int A[], int bt, int mid, int ed) {
-
int i, j, k, len = ed - bt + 1;
-
int tmp[] = new int[len];
-
-
for (i = bt, j = mid + 1, k = 0; i <= mid && j <= ed; k++) {
-
if (A[i] <= A[j]) {
-
tmp[k] = A[i++];
-
} else {
-
tmp[k] = A[j++];
-
}
-
}
-
-
while (i <= mid) {
-
tmp[k++] = A[i++];
-
}
-
-
while (j <= ed) {
-
tmp[k++] = A[j++];
-
}
-
-
for (i = 0; i < k; i++) {
-
A[bt + i] = tmp[i];
-
}
-
}
-
-
-
-
-
-
-
-
-
public static void quickSort(int A[], int bt, int ed) {
-
if (bt < ed) {
-
int pivot = pivotPartition(A, bt, ed);
-
-
quickSort(A, bt, pivot - 1);
-
-
quickSort(A, pivot + 1, ed);
-
}
-
}
-
-
private static void swapVar(int A[], int bt, int ed) {
-
int mid = bt + (ed - bt) / 2;
-
-
if (mid != bt) {
-
A[bt] = A[bt] ^ A[mid];
-
A[mid] = A[bt] ^ A[mid];
-
A[bt] = A[bt] ^ A[mid];
-
}
-
}
-
-
-
-
-
-
-
-
-
-
private static int pivotPartition(int A[], int bt, int ed) {
-
-
swapVar(A, bt, ed);
-
-
int stand = A[bt];
-
-
while (bt < ed) {
-
while (bt < ed && A[ed] >= stand) {
-
ed--;
-
}
-
if (bt < ed) {
-
A[bt++] = A[ed];
-
}
-
-
while (bt < ed && A[bt] <= stand) {
-
bt++;
-
}
-
if (bt < ed) {
-
A[ed--] = A[bt];
-
}
-
}
-
-
A[bt] = stand;
-
-
return bt;
-
}
-
-
-
-
-
-
-
-
public static void heapSort(int A[], int n) {
-
int tmp;
-
-
-
buildMaxHeap(A, n);
-
-
for (int j = n - 1; j >= 1; j--) {
-
tmp = A[0];
-
A[0] = A[j];
-
A[j] = tmp;
-
-
maxheapIfy(A, 0, j);
-
}
-
}
-
-
-
-
-
-
-
-
private static void buildMaxHeap(int A[], int n) {
-
for (int i = (n - 2) / 2; i >= 0; i--) {
-
maxheapIfy(A, i, n);
-
}
-
}
-
-
-
-
-
-
-
-
-
private static void maxheapIfy(int A[], int i, int n) {
-
int left, right, loc;
-
-
while (i < n) {
-
left = 2 * i + 1;
-
right = 2 * i + 2;
-
loc = i;
-
-
if (left < n && A[left] > A[i]) {
-
i = left;
-
}
-
-
if (right < n && A[right] > A[i]) {
-
i = right;
-
}
-
-
if (loc != i) {
-
A[i] = A[loc] ^ A[i];
-
A[loc] = A[loc] ^ A[i];
-
A[i] = A[loc] ^ A[i];
-
} else {
-
break;
-
}
-
}
-
}
-
-
-
-
-
-
-
-
public static void selectSort(int A[], int n) {
-
int i, j, loc;
-
-
for (i = 0; i < n; i++) {
-
loc = i;
-
-
for (j = i + 1; j < n; j++) {
-
if (A[j] < A[loc]) {
-
loc = j;
-
}
-
}
-
-
if (loc != i) {
-
A[i] = A[i] ^ A[loc];
-
A[loc] = A[i] ^ A[loc];
-
A[i] = A[i] ^ A[loc];
-
}
-
}
-
}
-
-
-
-
-
-
-
-
public static void insertSort(int A[], int n) {
-
int i, j, tmp;
-
-
for (i = 1; i < n; i++) {
-
tmp = A[i];
-
-
for (j = i - 1; j >= 0; j--) {
-
if (A[j] > tmp) {
-
A[j + 1] = A[j];
-
} else {
-
break;
-
}
-
}
-
-
A[j + 1] = tmp;
-
}
-
}
-
-
-
-
-
-
-
-
public static void bubbleSort(int A[], int n) {
-
int i, j;
-
-
for (i = 0; i < n - 1; i++) {
-
for (j = 0; j < n - i - 1; j++) {
-
if (A[j] > A[j + 1]) {
-
A[j] = A[j] ^ A[j + 1];
-
A[j + 1] = A[j] ^ A[j + 1];
-
A[j] = A[j] ^ A[j + 1];
-
}
-
}
-
}
-
}
-
-
-
-
-
-
-
public static void printArr(int A[]) {
-
for (int i = 0; i < A.length; i++) {
-
if (i == A.length - 1) {
-
System.out.printf("%d\n", A[i]);
-
} else {
-
System.out.printf("%d ", A[i]);
-
}
-
}
-
}
-
}