堆排序:
import java.util.Scanner;
public class HeapSort {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入n:");
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
sort(a);
for (int i = 0; i < n; i++) {
System.out.print(a[i] + " ");
}
}
public static void sort(int[] a) {
int k = a.length / 2 - 1;//堆排序是从最后一个非叶子起点开始的,即为 length / 2 - 1;
for (int i = k; i >= 0; i--) {
adjustHeap(a, i, a.length);
}
for (int j = a.length - 1; j > 0; j--) {//j > 0 是因为建好堆以后就有了最大值,所以少一次。
swap(a, 0, j);
adjustHeap(a, 0, j);
}
}
//堆的特点:左子节点为i*2+1,右子节点为i*2+2;
public static void adjustHeap(int[] a, int i, int length) {
int temp = a[i];
for (int j = 2 * i + 1; j < length; j = j * 2 + 1) {
if (j + 1 < length && a[j + 1] > a[j]) {//如果右节点比左节点要大的话,直接指向右节点
j++;
}
if (a[j] > temp) {
a[i] = a[j];
i = j;
} else {
break;//因为下面的已经是排好了的。
}
}
a[i] = temp;
}
public static void swap(int[] data, int a, int b) {
int temp = data[a];
data[a] = data[b];
data[b] = temp;
}
}
希尔排序:
import java.util.Scanner;
public class Shell {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//输入数组的长度
int[] data = new int[n + 1];
for (int i = 1; i <= n; i++) {
data[i] = sc.nextInt();//赋值
}
for (int i = n / 2; i > 0; i /= 2) {
shellSort(data, i);
}
for (int i = 1; i <= n; i++) {
System.out.print(data[i] + " ");
}
}
public static void shellSort(int[] data, int jg) {
//插入排序的思想
for (int i = 1 + jg; i < data.length; i++) {
if (data[i] < data[i - jg]) {//如果后面的小于前面的
data[0] = data[i];//先把这个存储起来.
int j = i - jg;
do {
data[j + jg] = data[j];
j = j - jg;
} while (j > 0 && data[j] > data[0]);
data[j + jg] = data[0];
}
}
}
}