import java.util.Arrays;
public class TestSort {
/**
* 冒泡排序 (效率 O(n²),适用于排序小列表。)
*
* @param arr
* 相邻两两比较
*/
public void BubbleSortArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
print(arr);
}
}
/**
* 选择排序 (效率O(n²),适用于排序小的列表)
*
* @param arr
* 从数组中找出最小值,即从0和12345比大小,第一轮循环就能把最小值换到最开头
*/
public void SelectSortArray(int[] arr) {
int min;/* 定义最小值 */
for (int i = 0; i < arr.length; i++) {
min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
if (i != min) {
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
print(arr);
}
}
/**
* 插入排序 (最佳效率O(n);最糟效率O(n²)与冒泡、选择相同,适用于排序小列表 )
*
* @param arr
* 基本思想:把n个待排序的元素看成一个有序表和一个无序表,开始有序表只包含一个元素
* ,无序表中包含n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较
* ,将它插入到有序表中的适当位置,使之成为新的有序表。
*
* 若列表基本有序,则插入排序比冒泡、选择更有效率。
*/
public void InsertSortArray(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];// temp标记为未排序第一个元素
int j = i - 1;
while (j >= 0 && arr[j] > temp) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
print(arr);
}
/**
* 希尔排序 (加强版的插入排序)
*
* @param arr
* 原理:根据需求,如果你想要结果从小到大排列,它会首先将数组进行分组,然后将较小值移到前面,较大值
* 移到后面,最后将整个数组进行插入排序,这样比起一开始就用插入排序减少了数据交换和移动的次数,
*/
public void ShellSortArray(int[] arr) {
int j, temp;
for (int increment = arr.length / 2; increment > 0; increment /= 2) {
// System.out.println("incre:"+increment);
for (int i = increment; i < arr.length; i++) {
temp = arr[i];
for (j = i; j >= increment; j -= increment) {
if (temp < arr[j - increment]) {
arr[j] = arr[j - increment];
} else {
break;
}
}
arr[j] = temp;
}
}
print(arr);
}
public void print(int[] arr) {
for (int a : arr) {
System.out.print(a + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = { 5, 4, 7, 3, 2, 9, 23, 17 };
TestSort ts = new TestSort();
// 0.利用Arrays带有的排序方法快速排序
// Arrays.sort(arr);
// ts.print(arr);
// 1.冒泡排序
// ts.BubbleSortArray(arr);
// 2.选择排序
// ts.SelectSortArray(arr);
// 3.插入排序
// ts.InsertSortArray(arr);
// 4.希尔排序
//ts.ShellSortArray(arr);
// 5.归并排序
// 6.快速排序
// 7.堆排序
// 8.拓扑排序
// 9.竞标赛排序
// 10.基数排序
}
}