Java数据结构与算法——直接插入排序

排序算法

  • 直接插入排序

直接插入排序

一个序列中只有1个元素那它一定是有序的
取原序列第一个元素作为子序列,这个子序列一定是有序的
取出原序列第二个元素赋值给哨兵,将哨兵的值与子序列最后一个元素进行比较
        如果子序列最后一个元素大于哨兵的值,将子序列扩大一位,将子序列最后一个元素后移一位
        循环遍历哨兵与子序列前一位的值的大小,直到当前值小于哨兵的值,就将哨兵的值放在子序列当前下标+1处
        这样子序列一样是有序的
		如果子序列最后一个元素小于哨兵的值,就将哨兵的值放在子序列当前下标+1处,就是子序列最后一个元素下标 + 1处
取出原序列第三个元素赋值给哨兵。。。。
重复上述流程后,列表就是有序的
public static void insertSort(int[] arr) {
		//int count = 0;交换次数
		for (int i = 1; i < arr.length; i++) {
			int temp = arr[i];// 哨兵中放入无序列表的第一位元素
			int index = i - 1;// 有序列表最后一位的下标
			// 找到要添加无序元素的下标
			while (index >= 0 && temp < arr[index]) {
				// 无序列表的第一位元素值小于有序列表最后一位元素,就将该无序元素根据大小放入有序列表中
				// 有序列表放入新元素时,有序列表最后一个元素后移一位
				arr[index + 1] = arr[index];
				// 有序列表的下标前移一位,将无序元素与有序列表的倒数第二个元素比较大小

				index--;//此处可能会是-1,所以要在while处添加判断
			}
			// 在合适位置index处添加当前元素
			arr[index + 1] = temp;// 在
			//count += 1;
		}
		//System.out.println("共交换了" + count + "次");
	}

测试

public static void main(String[] args) {
		int[] arr = new int[10000];
		for (int i = 0; i < 10000; i++) {
			arr[i] = (int) (Math.random() * 10000);
			
		}
		
		long c1 = System.currentTimeMillis();
		insertSort(arr);
		long c2 = System.currentTimeMillis() - c1;
		System.out.println("总耗时:" + c2);		
	}

	//总耗时:32

你可能感兴趣的:(数据结构与算法)