public static void main(String[] args) {
// 原始数据
int[] data = { 1, 3, 6, 2, 4, 8, 9, 5, 12 };
// 1.插入排序:希尔排序
System.out.println("希尔排序:\t" + Arrays.toString(shellSort(data)));
}
// 1.插入排序:希尔排序
private static int[] shellSort(int[] data) {
// 划分组
for (int r = data.length / 2; r >= 1; r /= 2) {
// 对每一组进行插入排序
for (int i = r; i < data.length; i++) {
int insertData = data[i];// 插入的数据
int j = i - r;// 临时序号
while (j >= 0 && data[j] < insertData) {
data[j + r] = data[j];
j -= r;
}
data[j + r] = insertData;
}
}
return data;
}
}
3.冒泡排序 3.1.基本思想依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
用二重循环实现,外循环变量设为i,内循环变量设为j。假如有n个数需要进行排序,则外循环重复n-1次,内循环依次重复n-1,n-2,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,n-1,对于每一个i,j的值依次为0,1,2,...n-i 。
设数组长度为N:
1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
3.N=N-1,如果N不为0就重复前面二步,否则排序完成。
时间复杂度分析。其外层循环执行 N - 1次。内层循环最多的时候执行N次,最少的时候执行1次,平均执行 (N+1)/2次。
所以循环体内的比较交换约执行 (N - 1)(N + 1) / 2 = (N^2 - 1)/2(其中N^2是仿照Latex中的记法,表示N的平方)。按照计算复杂度的原则,去掉常数,去掉最高项系数,其复杂度为O(N^2)。
package MySort;
import java.util.Arrays;
public class MySortTest4 {
public static void main(String[] args) {
// 原始数据
int[] data = { 1, 3, 6, 2, 4, 8, 9, 5, 12 };
// 2.交换排序:冒泡排序
System.out.println("冒泡排序:\t" + Arrays.toString(bubbleSort(data)));
}
// 2.交换排序:冒泡排序
private static int[] bubbleSort(int[] data) {
// 冒泡次数
for (int i = 0; i < data.length; i++) {
// 冒泡
for (int j = 0; j < data.length - i - 1; j++) {
if (data[j] > data[j + 1]) {
int temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
}
}
}
return data;
}
}
4.快速排序 4.1.基本思想