【排序算法系列】插入排序


插入排序的算法一句话可以描述:

a[0].....a[n-1] n个元素进行排序,假设a[0]...a[i-1]是一个有序序列,将a[i]插入到这个有序序列的适当位置中。

一、常规


最小的有序序列即为a[0],i从1开始到n-1

 

    第一种是每次a[i]与有序序列a[0]...a[i-1]中的元素(设为a[j])比较,从左往右,如果第一次碰到a[i]<a[j],那么记录这个j的位置并break循环,让a[j]到a[i-1]的每个元素后移,最后将a[j]这个元素替换为a[i]的值(需要事先保存好a[i]的值,因为在后移过程中a[i]的值会被覆盖)

for (int i = 1; i < array.length; i++) {
	int m = -1;//或m = i那么下面的if(m >= 0)改成if(m < i)
	for (int j = 0; j <= i - 1; j++) {
		// 找要插入的位置
		if (array[i] < array[j]) {
			m = j;
			break;
		}
	}
	if (m >= 0) {
		// 将比array[i]大的向后移
		int temp = array[i];
		for (int k = i - 1; k >= m; k--) {
			array[k + 1] = array[k];
		}
		array[m] = temp;
	}
}

 


第二种是每次a[i]与有序序列a[0]...a[i-1]中的元素(设为a[j])比较,从右往左,如果a[i]<a[j],那么记录这个j的位置并继续循环(因为左边可能还有比a[i]大的元素),让a[j]到a[i-1]的每个元素后移,最后将a[j]这个元素替换为a[i]的值(需要事先保存好a[i]的值,因为在后移过程中a[i]的值会被覆盖)

 

for (int i = 1; i < array.length; i++) {
	int m = i;
	for (int j = i - 1; j >= 0 && array[i] < array[j]; j--) {
		m = j;
	}
	if (m < i) {
		// 将比array[i]大的向后移
		int temp = array[i];
		for (int k = i - 1; k >= m; k--) {
			array[k + 1] = array[k];
		}
		array[m] = temp;
	}
}

 

或再精简一点,其中for (j = i - 1; j >= 0 && array[i] < array[j]; j--);这句代码也可以用另一种方式表达

for (j = i - 1; j >= 0; j--){if(array[i] > array[j])break;},程序非常灵活的,需要随机应变

 

for (int i = 1, j; i < array.length; i++) {
	for (j = i - 1; j >= 0 && array[i] < array[j]; j--);
	if (j < i) {
		int temp = array[i];
		for (int k = i - 1; k >= j + 1; k--) {
			array[k + 1] = array[k];
		}
		array[j + 1] = temp;
	}
}

 

 


二、将a[i]元素插入到a[0]...a[i-1]有序序列中,a[i]在与a[j],j∈{0..i-1}进行比较大小时,同时进行移位操作

    

    array[i]插入有序子序列array[0]...array[i-1]时,设j∈{0..i-1},若array[i]<array[j],则将array[j+1]替换为array[j] (表示array[j]后移一位),循环直到array[i]>array[j]或循环结束。将array[j+1]的值替换为temp (temp为事先保存的array[i]的值)。

for (int i = 1; i < array.length; i++) {
	int temp = array[i], j;
	for (j = i - 1; j >= 0 && temp < array[j]; j--) {
		// array[i]与arra[j]一边比较,一边移动(当array[i]<array[j])
		array[j + 1] = array[j];
	}
	array[j + 1] = temp;
}

 


三、a[i]插入有序序列a[0]...a[i-1]时,设temp = array[i],如果a[j]<temp也可以是array[j+1]<array[j],则交换a[j]与a[j+1]      j∈{0..i-1}

 

for (int i = 1; i < array.length; i++) {
	int temp = array[i],j;
	for (j = i - 1; j >= 0; j--) {
		if (array[j] > temp) {
			array[j] = array[j] ^ array[j + 1];
			array[j + 1] = array[j] ^ array[j + 1];
			array[j] = array[j] ^ array[j + 1];
		}
	}
}

 

 

 参考:

http://blog.csdn.net/morewindows/article/details/17488865

猜你喜欢

转载自jaychang.iteye.com/blog/2261560