算法学习——插入排序

插入排序的实现方式是用一层for循环里套一层while循环,和选择排序有点不同,但是既然是排序,就离不开比较,经过比较之后才会有顺序,所以插入排序也是通过选择元素之后再进行比较之后实现的。

假设要为数组a进行排序,插入排序的思想是直接以数组前两个元素为标准向后扩展,第一次扩展之前以及每次扩展后都会进行一次向前比较,for循环从a[1]开始,一次for循环扩展一位,第一次比较的就是a[0]和a[1],临时变量temp所替代的元素为a[1],从a[1]向a[0]比较,如果a[1]小于a[0],则将a[1]插到a[0]的前面,因此叫做插入排序,经过一次扩展后,temp代替a[2],由a[2]向前比较,以此类推,当for循环遍历结束后,排序完成。

简单排序流程如下:

int[] a = {32,12,21,43,65};

第一趟排序后:[12,32],21,43,65

第二趟排序后:[12,21,32],43,65

第三趟排序后:[12,21,32,43],65

第四趟排序后:[12,21,32,43,65]

代码实现及测试结果如下:

package pp.suanfa;

/**
 * 
 * 插入排序
 * 
 * @author Administrator
 *
 */

public class InsertSort {
	
	public static void iSort(int[] a)
	{
		if(a!=null)
		{
			for(int i=1;i<a.length;i++)
			{
				int temp = a[i],j=i;//取出a[i]和i的值
				if(a[j-1]>temp)//当前面的数比后面的数大时
				{
					while(j>=1&&a[j-1]>temp)//向前遍历将大数换到后面
					{
						a[j] = a[j-1];
						j--;
					}	
				}
				a[j] = temp;//将小数换到前面
			}
		}
	}
	public static void main(String[] args){
		int[] a = {32,21,16,54,35};
		iSort(a);
		for(int i=0;i<a.length;i++)
		{
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}
}

其实代码中的int temp = a[i];a[j]=a[j-1];a[j]=temp;就是简单的位置互换(要注意第三句里的j已经是执行完自减操作的,相当于i-1),不过这里不是两两比较,而是让第i个元素同其前面的i-1个元素比较,最后进行位置互换,所以将第三句放在了第二层循环外,第一层循环内。

如果运气好的话,a[j-1]一直小于temp,则无需进入第二层循环,此时时间复杂度就为O(n),反之每次都要进入第二层while循环,此时的时间复杂度就为O(n²).

猜你喜欢

转载自blog.csdn.net/qq_39209361/article/details/82845537
今日推荐