算法的知识感觉忘的差不多了,记录一下复习的过程,随时更新:
public int[] testHelper() { //用来辅助测试
int a[];
int n = (int) (Math.random() * 10 + 1);
a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = (int) (Math.random() * 100);
}
return a;
}
public void selectionSort(int[] a) {
/*
* 扫描整个数组,找到最小的元素并与第一个数进行交换
*/
int n = a.length;
for (int i = 0; i < n - 1; i++) {
int min = i;
for (int j = i + 1; j < n; j++) {
if (a[j] < a[min]) {
min = j;
}
}
int m;
m = a[i];
a[i] = a[min];
a[min] = m;
}
}
public void bubbleSort(int a[]) {
/*
* 比较相邻元素的大小,如果前一个数大于后一个,则交换位置 最终最大的数沉到最后
*/
int n = a.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (a[j + 1] < a[j]) {
int m = a[j];
a[j] = a[j + 1];
a[j + 1] = m;
}
}
}
}
public void insertSort(int a[]) {
/* 从右到左扫描数组,遇到第一个小于它的数时,将它插在这个数的后面 */
int n = a.length;
for (int i = 1; i < n; i++) {
int v = a[i];
int j = i - 1;
while (j >= 0 && a[j] > v) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = v;
}
}
public void mergeSort(int a[]) {
/* 将数组一分为二 ,递归排序 */
int n = a.length;
if (n > 1) {
int b[];
int c[];
b = new int[n / 2];
for (int i = 0; i < n / 2; i++) {
b[i] = a[i];
}
if (n % 2 != 0) {
c = new int[n / 2 + 1];
} else {
c = new int[n / 2];
}
for (int i = n / 2, j = 0; i < n; i++, j++) {
c[j] = a[i];
}
mergeSort(b);
mergeSort(c);
merge(b, c, a);
}
}
private void merge(int b[], int c[], int a[]) {
int p = b.length;
int q = c.length;
int k = 0, i = 0, j = 0;
while (i < p && j < q) {
if (b[i] <= c[j]) {
a[k] = b[i];
i++;
} else {
a[k] = c[j];
j++;
}
k++;
}
if (i == p) {
for (; j < q; j++, k++) {
a[k] = c[j];
}
} else if (j == q) {
for (; i < p; i++, k++) {
a[k] = b[i];
}
}
}
快速排序:
public void quickSort(int[] a, int l, int r) {
if (l < r) {
int s = partition(a, l, r);
quickSort(a, l, s - 1);
quickSort(a, s + 1, r);
}
}
private int partition(int a[], int l, int r) { //找到标志位
int p = a[l];
int j = l;
int m;
for (int i = l + 1; i <= r; i++) {
if (a[i] < p) {
m = a[j + 1];
a[j + 1] = a[i];
a[i] = m;
j++;
}
}
m = a[l];
a[l] = a[j];
a[j] = m;
return j;
}
快速排序的优化方案较多,因此将优化单独放在一篇文章中: