Java常见经典算法详解-插入排序(Insertion Sort)

插入排序(Insertion Sort)算法简介:

插入排序是一种丛序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。

插入排序(Insertion Sort)算法原理:

插人排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。插入排序就类似排纸牌,从牌桌上抓牌排在手里,手里的牌始终是有序的,每次都把牌放在相应的位置,这就是插入排序。插入排序步骤如下:

  • 从第一个元素开始,该元素可以认为已经被排序
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  • 将新元素插入到该位置后
  • 重复步骤2~5,直到所有元素归位

举例说明:

现在需要对数组序列5 3 4 7 2 8 6 9 1 运用插入排序算法从小到大排序。

第一轮:假设最左边的数字5已经完成排序,所以此时只有5是已归位的数字。

第二轮:接下来,从待排数字(未排序区域)中取出最左边的数字3,将它与左边已归位的数字进行比较。若左边的数字更大,就交换这两个数字。重复该操作,直到左边已归位的数字比取出的数字更小,或者取出的数字已经被移到整个序列的最左边为止。由于5>3,所以交换这两个数字位置。

第三轮:此时3和5已归位,还剩下右边7个数字未排序。同上述操作,由于4<5,4>3,因此将4插入3与5之间,此时3、4、5均已归位。

第三轮:重复上述操作直到所有数字都归位,排序即完成。

插入排序(Insertion Sort)代码实现:

public class Demo {
 
	public static void main(String[] args) {
		int[] array= {5,3,4,7,2,8,6,9,1};
		int[] newarray=insertionSort(array);
		for(int arr:newarray) {
			System.out.print(arr+" ");
		}
	}
	public static int[] insertionSort(int[] array){
		for(int i=1;i<array.length;i++) {
			for(int j=i;j>0;j--) {
				if(array[j]<array[j-1]) {
					int temp=array[j];
					array[j]=array[j-1];
					array[j-1]=temp;
				}
			}
		}
		return array;
	}
}

插入排序(Insertion Sort)的时间复杂度:

在插入排序中,需要将取出的数据与其左边的数字进行比较。就跟前面讲的步骤一样,如果左边的数字更小,就不需要继续比较,本轮操作到此结束,自然也不需要交换数字的位置。然而,如果取出的数字比左边已归位的数字都要小,就必须不停地比较大小,交换数字,直到它到达整个序列的最左边为止。具体来说,就是第k轮需要比较k-1次。因此,在最糟糕的情况下,第2轮需要操作1次,第3轮操作2次....第n轮操作n-1次,所以时间复杂度和冒泡排序的一样,都为O(n²)。和前面讲的排序算法一样,输入数据按从大到小的顺序排列时就是最糟糕的情况。

原创文章 12 获赞 6 访问量 1453

猜你喜欢

转载自blog.csdn.net/YUBANGSHUANGYUER/article/details/105895752