1、选择排序
简单描述下就是:首先找到数组中最小的那个元素,将它和数组第一个元素交换位置;然后在剩下的元素中找到最小的元素与数组第二个元素交换位置;如此往复,直到将整个数组排序。
长度为 N 的数组,选择排序需要大约(N^2)/2次比较和N次交换
2、插入排序
插入排序,将每一个元素插入到其他已经有序的局部数组中的适当位置,为了给插入的元素腾出空间,我们需要将其余适当位置后的元素右移一位;
简单来说就是先确定一个索引值i,从这个i开始,定义j=i,a[j]与a[j-1]比较,若a[j-1]>a[j]则交换二者,j–,若a[j-1]<a[j]则表明已经到了正确的位置,退出小循环,否则继续重复操作,直到j=0;完成小循环后把索引i++。
3、希尔排序
简单说就是先把"插入排序"的交换间隔从1变成h,排完一轮后 h=h/3,再重复操作直到h>=1。
以下为代码
import java.util.*;
public class Example {
public static void SelectSort(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
int min = i;
for (int j = i+1; j < a.length; j++) {
if (less(a[j], a[min])) {
min = j;
}
}
exch(a, i, min);
}
}
public static void InsertSort(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
for (int j = i; j > 0 && less(a[j], a[j-1]); j--) {
exch(a, j, j-1);
}
}
}
public static void ShellSort(Comparable[] a) {
int h = 1;
while (h < a.length/3) {
h = 3*h + 1;
}
while (h >= 1) {
for (int i = h; i < a.length; i++) {
for (int j = i; j >= h && less(a[j], a[j-h]); j-=h) {
exch(a, j, j-h);
}
}
h = h / 3;
}
}
public static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
public static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
Comparable[] arr = new Comparable[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = in.nextInt();
}
SelectSort(arr);
InsertSort(arr);
ShellSort(arr);
show(arr);
}
}