插入排序
我们有了选择排序,冒泡的基础了,我还是说一下我对排序算法的认识吧,感觉排序这个东西嘛,在我们日常的代码中可能用哪种差别不是特别的大,但是如果要处理很多数据的时候,排序的重要性便体现出来了,而且我认为基础算法和编程的基础是我们每个人都应该具备的知识吧,所以认真的分析一下还是有一点点必要的。
然后我想说的就是插入排序的思想,插入排序的思想和我们在斗地主的时候喜欢将牌从大到小的排列的思想是一致的,我们会选出一张牌放到相应的位置,从某种意义上讲,如果在数据的可序性较高的时候,插入排序是效率最高的一种排序的方式。
package paixu;
public class Insertion {
public static 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);
}
}
}
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);
}
}
}
public static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
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;
}
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.println(a[i] + " ");
System.out.println();
}
}
for (int i = 0; i < a.length; i++) {
System.out.println(a[i] + " ");
System.out.println();
}
}
public static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++)
if (less(a[i], a[i - 1]))
return false;
return true;
}
if (less(a[i], a[i - 1]))
return false;
return true;
}
public static void main(String[] args) {
String[] a = "B,D,C,A,E,G,F, ".split(",");
sort(a);
assert isSorted(a);
show(a);
String[] a = "B,D,C,A,E,G,F, ".split(",");
sort(a);
assert isSorted(a);
show(a);
}
}
当然根据我们的代码,可想而知我们的输出的结果是按照顺序排好的A,B,C,D,E,F,G,我们这里并不是单纯的把所有代码都罗列到主函数里面,这里面用到的函数的类的思想非常的明显,这样写的好处是,如果我们想实现其它排序的话只需要非常简单的修改一点代码即可。
这里我们主要起到排序作用的代码是我们的sort函数,在这里我们采用两个for循环,外层循环控制i的位置,当我们的i,在第二个数的时候会判断和第一个数的关系,如果比第一个数大,则保持不变,如果比第一个小则交换位置,这个时候我们的数组中前两个字符便有了顺序,之后我们会对数组里面其它的字符进行判断,看它要插入到哪两个字符之间,这样便完成了我们的插入排序,当然插入的过程中并不是直接插入的,而是每两个都要判断一看,看一下具体要插在哪里。
我们的less函数,返回的值是一个boolean类型的数值,这里面用到了一个comparable的函数,此方法如果这个字符串是等
参数字符串那么
返回值0
,如果这个字符串是按字典顺序小于字符串参数那么返回
小于0的值,
如果此字符串是按字典顺序大于字符串参数那么
一个大于0的值
。
我们的exch函数的目的是为了判断的,是用来将两个数据的值进行交换的。
我们的show函数的目的是,将排序好的数组输出在屏幕上面。
我们的isSorted是一个判断,用来判断我们的排序是否成功的,如果我们的排序成功了,那么将返回一个true,如果排序失败了,那么我们将返回一个false。
我们的main函数中我们创建了一个string类型的数组,是将一个字符串通过split的方式变成的string类型的数组,然后调用我们的排序的方法,下面我们还涉及到一个重点就是断言的方法,也就是说,如果我们断言后面返回的是真的话,那么我们就执行下面的操作,也就是输出我们的结果,如果我们发现排序失败了,那么我们的断言将会起作用,这个时候我们会抛出一个异常,也就不会有结果的输出了。
当我们掌握了冒泡排序,选择排序,插入排序之后,我们已经掌握了排序算法中最为基础的几种排序了,在我日后的博客中还会为大家更新一些较为复杂的排序方式。