排序系列之——插入排序

1.算法思想:

           a.插入排序:回想一下我们打扑克的时候摸牌的过程,有时喜欢把牌按大小顺序排列起来,每次摸到的牌和手中的牌比较,如果小的话就往前移动,一直移到比它小的牌后面,比它大的牌前面,然后将牌插入,一直到牌摸完,我们手中的牌最后就是有序的。而插入排序就像我们打扑克牌摸牌的过程是一样的。

如下是我们插入排序的代码:

public static <T extends Comparable<T>> T[] sort(T[] t) {

		for (int i = 1; i < t.length; i++) {
			if (t[i].compareTo(t[i - 1]) < 0) {// 只有当前拿到的牌小于手中的最后一张牌才进行比较和移动
				T tem = t[i];// 相当于是每次摸到的那张牌
				int j = i - 1;
				while (j >= 0 && tem.compareTo(t[j]) < 0) {// 和它之前的元素(牌比较)一直找到比它小的那张牌的位置
					t[j + 1] = t[j];// 前面的牌都向后移动腾出一个位置给待插入的那张牌
					j--;
				}
				t[j + 1] = tem;// 把它放在比它小的那张牌位置的后面
			}
		}
		return t;
	}

 然而,如果待排的数据量比较大的话,我们的插入排序有个缺点是要进行大量的元素移动,从而导致排序比较慢,所以希尔排序应运而生了。

         b.希尔排序:希尔排序是插入排序的一种又称“缩小增量排序”,基本思想是将待排序列按我们的增量分组,每组按照我们基本的插入排序排序,直到我们的增量减至为1整个序列为一组,此时我们的序列已经基本有序,最后做一次基本插入排序便使得待排序列有序,这样大量减少了移动次数。

如下是我们的希尔排序代码:

public static <T extends Comparable<T>> T[] shellSort(T[] t) {
		for (int di = t.length / 2; di > 0; di /= 2) {// di为我们的缩小增量
			for (int i = di; i < t.length; i += di) {
				if (t[i].compareTo(t[i - di]) < 0) {
					T tem = t[i];
					int j = i - di;
					while (j >= 0 && tem.compareTo(t[j]) < 0) {
						t[j + di] = t[j];
						j -= di;
					}
					t[j + di] = tem;
				}
			}
		}
		return t;
	}

2.总代码清单 

package Sort;

import java.util.Arrays;

/**
 * @author xuyp 
 */
public class InsertSort {

	/**
	 * 普通插入排序
	 * 
	 * @param t
	 * @return
	 */
	public static <T extends Comparable<T>> T[] sort(T[] t) {

		for (int i = 1; i < t.length; i++) {
			if (t[i].compareTo(t[i - 1]) < 0) {// 只有当前拿到的牌小于手中的最后一张牌才进行比较和移动
				T tem = t[i];// 相当于是每次摸到的那张牌
				int j = i - 1;
				while (j >= 0 && tem.compareTo(t[j]) < 0) {// 和它之前的元素(牌比较)一直找到比它小的那张牌的位置
					t[j + 1] = t[j];// 前面的牌都向后移动腾出一个位置给待插入的那张牌
					j--;
				}
				t[j + 1] = tem;// 把它放在比它小的那张牌位置的后面
			}
		}
		return t;
	}

	/**
	 * @param t
	 * @return
	 */
	public static <T extends Comparable<T>> T[] shellSort(T[] t) {
		for (int di = t.length / 2; di > 0; di /= 2) {// di为我们的缩小增量
			for (int i = di; i < t.length; i += di) {
				if (t[i].compareTo(t[i - di]) < 0) {
					T tem = t[i];
					int j = i - di;
					while (j >= 0 && tem.compareTo(t[j]) < 0) {
						t[j + di] = t[j];
						j -= di;
					}
					t[j + di] = tem;
				}
			}
		}
		return t;
	}

	public static void main(String[] args) {
		Integer[] iarr = { 1, 3, 4, 2, 5, 7, 6 };
		iarr = InsertSort.sort(iarr);
		System.out.println("insertsort:" + Arrays.toString(iarr));

		String[] sarr = { "c", "e", "a", "b", "d" };
		sarr = InsertSort.sort(sarr);
		System.out.println("insertsort:" + Arrays.toString(sarr));

		Integer[] sliarr = { 1, 3, 4, 2, 5, 7, 6, 0, 9 };
		sliarr = InsertSort.shellSort(sliarr);
		System.out.println("shellsort:" + Arrays.toString(sliarr));
	}
}

3.运行结果 

猜你喜欢

转载自blog.csdn.net/sinat_22808389/article/details/81631239