1.冒泡法排序:
思想:
每一次排序,都是将两个相邻的数进行比较,将大的数移动的右边。
将会将最在原数放到最后。
public void test1() {
int[] a = { 4, 7, -923, 3, 4, 5, 5, 6, 7, 7, 4, 2, 2, 4, 4, 56, 546, 7, 678, 678, 89, 57, 45, 234, 234, 34, -90,
5, 676, 7, 2, 0, 5 };
for (int i = 0; i < a.length; i++) {
// 每一次计算时,最后一个数不在循环内,且已经比较过的最后的数,不参与再次比较
for (int j = 0; j < a.length - 1 - i ; j++) {
if (a[j] > a[j + 1]) {
int tem = a[j + 1];// 设置临时变量
a[j + 1] = a[j];
a[j] = tem;
print(a);
System.err.println();
}
}
}
2.选择法排序:
第一次选择一个最小的数,放到前前面 – 下标即是0。
第二次选择一个次的数放到下标为1的位置。
public void test() {
int[] a = { 4, 7, -923, 3, 4, 5, 5, 6, 7, 7, 4, 2, 2, 4, 4, 56, 546, 7, 678, 678, 89, 57, 45, 234, 234, 34, -90,
5, 676, 7, 2, 0, 5 };
for (int i = 0; i < a.length; i++) {
// 声明最小的数
int small = a[i];
// 声明一个更小的数的下标的位置
int index = -1;
for (int j = i + 1; j < a.length; j++) {
if (small > a[j]) {
small = a[j];// 设置更小的数是a[j]
index = j;// 记录下标
}
}
// 判断是否找到了更小的数
if (index != -1) {
// 交换位置
a[index] = a[i];
a[i] = small;
}
}
print(a);
}
3.快速排序
思想:
二分法。取出任意的一个数[下标为0的数]认为它的中间数。将所小于这个数的数,放到左边,将大于这个数的数放到右边。
再分另比较中间这个数的两边的数据。
排序算法:
4 2 7 0 5
第一次排序:
0 2 4 7 5
第二次排序:
0 2 4 7 5
第三次排序:
0 2 4 5 7
public void test3() {
int[] a = { -90, 5, 676, 7, 2, 0, 5 };
sort(a, 0, a.length - 1);
}
public void sort(int[] a, int from, int to) {
int left = from;
int right = to;
int mid = a[left];
while (left < right) { // 如果左边的下标还小于右边的下标的话,就可以进行比较
// 先从右向左找从mid小的
for (int i = right; i > left; i--, right--) {
if (a[i] < mid) {
a[left] = a[i];
a[i] = mid;
break;
}
}
// 再从左向右比较找比mid大的
for (int i = left; i < right; i++, left++) {
if (a[i] > mid) {
a[right] = a[i];
a[i] = mid;
break;
}
}
}
print(a);
// 如果开始的下标小于结束下标才有必要比较
if (from < left - 1) {
sort(a, from, left - 1);
}
if (right + 1 < to) {
sort(a, right + 1, to);
}
}