插入排序
好长时间没有写了,今天来复习一下插入排序。
插入排序。算法的大致思想和字面意思差不多,就是将无序的数组中插入到有序的数组中,当无序的数组为空时,排序就完成了。以上就是算法的大概思路,下面详细说一下。插入排序将要排序的数组分为两个“数组”,左边的数组为有序的数组,右边的为无序的数组。(两者相反也可)将右边数组的元素依次放入左边数组中的有序位置,等到右边数组的元素放完后,整个排序也就完成了。
下面再来说一说算法的具体细节。在算法的实现过程中,不可能直接将原数组分为两个数组,这样不仅会浪费时间,而且也会浪费机器的性能(开辟新的数组所需要的空间)。所以这里可以用指针来标记和分别两个数组。算法的大体由两个for循环构成,第一个是将无序的数组中的元素放入有序的数组中,第二个是将放入的元素放到有序数组中的合适位置。算法的大致思路也是容易想到的,一些细节问题都注释在代码中了。下面就是代码。
public class demo { public static void sort(Comparable[] a) { // 插入排序 // 用一个数组完成插入排序的算法,将a数组中前面和后面分成两个部分 int N = a.length; // 这里不用考虑a[i]数组中只有一个元素的情况,所以直接从1开始。 for (int i = 1; i < N; i++)// 为什么要从1开始,因为插入要有一个数组,那个一就是开始的数组 { // 建立数组a[i],再用j循环找出j再a[i]中的数组位置 for (int j = i; j > 0 && less(a[j], a[j - 1]); j--)// 比较位置,交换相邻的两个数字。不是严格意义上的插入排序 exch(a, j, j - 1); } } private static boolean less(Comparable v, Comparable w) { // 比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。 // 如果v大于w,返回false 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 main(String args[]) { // 1 2 4 6 7 7 8 23 55 56 90 Comparable[] a = {1,4,2,6,7,55,8,23,7,90,56}; sort(a); for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } } }
以上就是代码的实现,现在讲一讲算法实现我的一些想法。这个算法用了两个for循环,但是会发现第二个for循环内部做的事情有点多,因为每一次的比较都要交换当前元素和前一个元素的位置,直到找到合适的位置。所以第二个for循环内部可以改为while循环,将数组改为链表,这样就可以达到插入的目的。
上面看完后,会发现插入排序的特点,因为将数组分为了两个数组,所以插入排序对于那些已经大部分有序的数组排序起来要比选择排序要快的多。所以,对于排序算法的选择要根据问题而定。结束。