今天在学习数据结构的时候,把之前的资料重新看了看,又加深了自己对算法的理解
贴几个比较简单的算法,选择排序,插入排序,希尔排序
当然后每种排序都有自己的时间效率,这个效率就不贴出来了,当然下面的demo 也是看了《算法》这本书写出来的,自己共勉
import org.junit.Test;
/**
* @author Eric
* @date create in2018/8/10 19:53
*/
public class DemoTests {
@Test
public void testOfSort() {
String[] a = {"a", "b","g","y", "c", "d", "p"};
sort(a);
System.out.println("=====================");
chooseSort(a);
System.out.println("=====================");
shellSort(a);
System.out.println("=====================");
}
/**
* 插入排序
* 实现思路:假设左边是有序的,但是他们的位置其实并不是确定的,
* 因为后面来的元素会和他们做比较,插入相应位置,当索引到达数组的
* 最右边的时候,排序就结束了
* @param a
*/
private void sort(Comparable a[]) {
int N = a.length;
for (int i = 1; i < N; i++) {
for (int j = i; j >0 && less(a[j],a[j-1]) ; j--) {
exch(a, j, j - 1);
}
}
show(a);
}
/**
*
* 希尔排序
* 实现思路:使任意间隔为h的元素都是有序的
* @param a
*/
private void shellSort(Comparable a[]) {
int N = a.length;
int h = 1;
while (h < N / 3) {
h = 3 * h + 1;
}
while (h >= 1) {
for (int i = h; i < N; i++) {
for (int j = i ; j>=h && less(a[j],a[j-h]) ; j-=h) {
exch(a,j,j-h);
}
}
h /= 3;
}
show(a);
}
/**
* 选择排序
* 基本思路:就是在所有的元素中选择最小的元素放在第一的位置,
* 再选择第二小的位置放在第二个位置一次类推
* @param a
*/
private void chooseSort(Comparable a[]) {
int N = a.length;
for (int i = 0; i < N; i++) {
int min = i;
for (int j = i+1; j < N; j++) {
if (less(a[min],a[j])) {
min = j;
}
}
exch(a, i, min);
}
show(a);
}
/**
*
*比较两者之间的大小
*/
private boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
/**
*
*交换两者之间的位置
*/
private void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
private void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(" " + a[i]);
}
System.out.println(" ");
}
}
这是自己