插入排序思路分析及代码实现

插入排序思路分析及代码实现

思路分析

在这里插入图片描述插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

算法分析

1,当初始序列为正序时,只需要外循环n-1次,每次进行一次比较,无需移动元素。此时比较次数(C min)和移动次数(Mmin)达到最小值。
C min=n-1
Mmin=0
此时时间复杂度为O(n)。
2,当初始序列为反序时,需要外循环n-1次,每次排序中待插入的元素都要和[0,i-1]中的i个元素进行比较且要将这i个元素后移i次,加上tmp=arr[i]与arr[j]=temp的两次移动,每趟移动次数为i+2,此时比较次数和移动次数达到最大值。
Cmax = 1+2+…+(n-1) = n(n-1)/2=O(n2)
Mmax = (1+2)+ (2+2)+…+(n-1+2)=(n-1)(n+4)/2=O(n2)
此时时间复杂度O(n)
3,在直接插入排序中只使用了i,j,tmp这三个辅助元素,与问题规模无关,空间复杂度为O(1)。
4,相同元素的相对位置不变,如果两个元素相同,插入元素放在相同元素后面。是一种稳定排序

代码实现

package com.sort;

import java.util.Arrays;

public class InsertSort {

	public static void main(String[] args) {

		int[] arr = { 101, 34, 119, 1, -1, 89 };
		insertSort(arr);
	}

	// 插入排序
	public static void insertSort(int[] arr) {
		int insertVal=0;
		int insertIndex =0;
		// 使用for循环进行代码简化
		for (int i = 1; i < arr.length; i++) {
			// 定义待插入的数
			insertVal = arr[i];
			insertIndex = i - 1;// 及arr[1]的前面这个数的下标
			
			// 给insertVal 找到插入位置
			// 说明
			// 1.insertIndex >= 0 保证insertVal找到插入位置,不越界
			// 2.insertVal<arr[insertIndex],待插入的数没有找到插入位置
			// 3.就需要将arr[insertIndex]后移
			while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
				arr[insertIndex + 1] = arr[insertIndex];
				insertIndex--;
			}
			// 当退出while循环时,说民找到插入位置,inertIndex+1
			if (insertIndex + 1 != i) {
				arr[insertIndex + 1] = insertVal;
			}
			System.out.println("第" + i + "轮插入后");
			System.out.println(Arrays.toString(arr));
		}
		
		/*
		// 第一轮
		// 定义待插入的数
		int insertVal = arr[1];
		int insertIndex = 1 - 1;// 及arr[1]的前面这个数的下标

		// 给insertVal 找到插入位置
		// 说明
		// 1.insertIndex >= 0 保证insertVal找到插入位置,不越界
		// 2.insertVal<arr[insertIndex],待插入的数没有找到插入位置
		// 3.就需要将arr[insertIndex]后移
		while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
			arr[insertIndex + 1] = arr[insertIndex];
			insertIndex--;
		}
		// 当退出while循环时,说民找到插入位置,inertIndex+1
		arr[insertIndex + 1] = insertVal;

		System.out.println("第一轮插入后");
		System.out.println(Arrays.toString(arr));

//		第二轮
		insertVal=arr [2];
		insertIndex=2-1;
		
		while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
			arr[insertIndex + 1] = arr[insertIndex];
			insertIndex--;
		}
		arr[insertIndex + 1] = insertVal;
		
		System.out.println("第二轮插入后");
		System.out.println(Arrays.toString(arr));

//		第三轮
		insertVal=arr [3];
		insertIndex=3-1;
		
		while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
			arr[insertIndex + 1] = arr[insertIndex];
			insertIndex--;
		}
		arr[insertIndex + 1] = insertVal;
		
		System.out.println("第3轮插入后");
		System.out.println(Arrays.toString(arr));
		*/
	}

}
发布了39 篇原创文章 · 获赞 31 · 访问量 6116

猜你喜欢

转载自blog.csdn.net/lu_long/article/details/103247465