简单排序(2)


接着上文说,这里,简单的分析下冒泡和选择之间的优劣之处:

  • 在冒泡排序中,当数据项的个数N较大时,算法做了N*N/2次比较,大概有一半的数据需要交换,则是N的平方/4。算法的运行时间为O(N*N)级。
  • 在选择排序中,当数据项的个数N较大时,和冒泡排序的比较次数一样,但是交换次数要少,所以,选择排序无疑最快。算法的运行时间为O(N*N)级。

说说插入排序。我的理解是:插入排序它有个要求,就是假设局部是有序的。而在冒泡和选择排序中,是不会出现局部有序的。什么意思呢?例如一队人按身高从矮到高的次序排列,冒泡和选择则是完全随机的,而插入则是前面几个人是按照排序的要求站的,只需要把后面没有按照排序要求站队的人安排好次序就行了。那这就需要一个标记元素,标记元素的左边是排好序的,右边是无序的。而被标记的人,需要先站到一边,然后左边排好序的人分别往右边移动一个位置,每移动一个,需要和被标记的人进行比较,直到被标记的人的身高大于或等于移动的人的身高,此时排序结束。

代码如下:
public class InsertSort {
	public static void main(String[] args) {
		InsertSort insertSort = new InsertSort();
		int[] b = new int[] { 0, 1, 9, 3, 2, 54, 32 ,3};
		insertSort.insertSort(b);
	}

	private static void insertSort(int[] arr) {
		int in, out;//out是被标记的元素,in是局部有序的数据项下标
		for (out = 1; out < arr.length; out++) {
			int temp = arr[out];//把被标记的元素拿出来
			in = out;//局部有序的下标从被拿出来的元素的下标开始
			while (in > 0 && arr[in - 1] <= temp) {//往右边移动位置且移动的元素和被标记的元素比较大小
				arr[in] = arr[in - 1];//交换位置
				in--;
			}
			arr[in] = temp;//比较结束,插入被标记元素
		}
		for (int i : arr) {
			System.out.print(i + ",");
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值