public class Sort {
public static void main(String[] args) {
// Sort.bubble();
// Sort.insert();
// Sort.insertTwo();
// Sort.insertThree();
// Sort.select();
int[] in = new int[] { 1, 33, 22, 44, 3, 5, 535, 654, 2, 7 };
Sort.fastSort(in, 0, in.length - 1);
// for (int i = 0; i < in.length; i++) {
// System.out.print(in[i]+" ");
// }
}
public static void bubble() {
Integer[] in = new Integer[] { 1, 33, 22, 44, 3, 5, 535, 654, 2, 7 };
for (int i = 0; i < in.length; i++) {
for (int j = 0; j < in.length - 1; j++) {
Integer s = null;
if (in[j] > in[j + 1]) {
s = in[j + 1];
in[j + 1] = in[j];
in[j] = s;
}
}
}
System.out.println(Arrays.toString(in));
}
// 以此选择一个索引不为0的,记录当前的值去与前一个做比较,找到合适的位置,将记录的值赋值
public static void insert() {
Integer[] in = new Integer[] { 1, 33, 22, 44, 3, 5, 535, 654, 2, 7 };
for (int i = 1; i < in.length; i++) {
for (int j = i; j > 0; j--) {
Integer s = null;
if (in[j] < in[j - 1]) {
s = in[j];
in[j] = in[j - 1];
in[j - 1] = s;
} else {
break;
}
System.out.println(in[j]);
}
}
System.out.println(Arrays.toString(in));
}
public static void insertTwo() {
// 经检验 insertTwo()与insert()俩个方法遍历的次数相同,所以时间复杂度是相同的
Integer[] in = new Integer[] { 1, 33, 22, 44, 3, 5, 535, 654, 2, 7 };
for (int i = 1; i < in.length; i++) {
int temp = in[i];// 保存每次需要插入的那个数
int j;
for (j = i; j > 0 && in[j - 1] > temp; j--) {// 这个较上面有一定的优化
in[j] = in[j - 1];// 吧大于需要插入的数往后移动。最后不大于temp的数就空出来j
}
in[j] = temp;// 将需要插入的数放入这个位置
}
System.out.println(Arrays.toString(in));
}
public static void insertThree() {
Integer[] in = new Integer[] { 1, 33, 22, 44, 3, 5, 535, 654, 2, 7 };
int i, j, temp;
for (i = 1; i < in.length; i++) {
temp = in[i];
for (j = i; j > 0; j--) {
if (in[j - 1] > temp) {
in[j] = in[j - 1];
} else {
break;
}
}
in[j] = temp;
}
System.out.println(Arrays.toString(in));
}
// 选择排序,找到最小的值的索引,将两值的位置互换
public static void select() {
Integer[] in = new Integer[] { 1, 33, 22, 44, 3, 5, 535, 654, 2, 7 };
int i, j, index;
for (i = 0; i < in.length; i++) {
index = i;
for (j = i + 1; j < in.length; j++) {
if (in[index] > in[j]) {
index = j;
}
}
int temp = in[i];
in[i] = in[index];
in[index] = temp;
}
System.out.println(Arrays.toString(in));
}
public static void fastSort(int[] in, int low, int high) {
int i, j, temp, t;
if (low > high) {
return;
}
i = low;
j = high;
// temp就是基准位
temp = in[low];
while (i < j) {
// 先看右边,依次往左递减
while (temp <= in[j] && i < j) {
j--;
}
// 再看左边,依次往右递增
while (temp >= in[i] && i < j) {
i++;
}
// 如果满足条件则交换
if (i < j) {
t = in[j];
in[j] = in[i];
in[i] = t;
}
}
// 最后将基准为与i和j相等位置的数字交换
in[low] = in[i];
in[i] = temp;
// 递归调用左半数组
fastSort(in, low, j - 1);
// 递归调用右半数组
fastSort(in, j + 1, high);
System.out.println(Arrays.toString(in));
}
}