Bootstrap

0311-插入排序、希尔排序及其Java实现

插入排序

认为数组当中第一个数值是已经排好序的数值,定义游标从第二个数值开始遍历,游标指向的数据插入到已经排好序的数字当中。

如何插入??

定义j游标指向i的前一个数值 j+1指向 i

j 和 j+1 指向的数据进行比较,如果j+1指向的数值小,则进行交换 , j--

直到 j 无法继续向前指或者 j + 1指向的值大,结束。

时间复杂度:O(n^2) 

 插入排序Java实现

package com.qc.排序;

import java.util.Arrays;

public class insertSort {
	public static void main(String[] args) {
		int[] shuzu = {7,5,10,0,3,1,6};
		sort(shuzu);
		System.out.println(Arrays.toString(shuzu));
	}
	public static void sort(int[] shuzu) {
		for(int i = 1;i<shuzu.length;i++) {//i定位当前元素
			for(int j=i-1;j>=0;j--) {//j j+1往回遍历比较元素大小
				if(shuzu[j+1]<shuzu[j]) {
					int temp = shuzu[j+1];
					shuzu[j+1] = shuzu[j];
					shuzu[j] = temp;
				}else {
					break;
				}
			}
		}
	}
			

}

希尔排序(缩小增量排序)

1. 按照数组长度的一半分组,组内进行插入排序 j j+间隔

2.按照数组长度的一半的一半分组,组内进行插入排序

.

.

.

直到无法继续分组,整个数组作为一组,进行插入排序

时间复杂度:nlogn

希尔排序Java实现 

package com.qc.排序;

import java.util.Arrays;

public class insertSort {
	public static void main(String[] args) {
		int[] shuzu = {7,5,10,0,3,1,6};
		sort(shuzu);
		System.out.println(Arrays.toString(shuzu));
	}
	public static void sort(int[] shuzu) {
		for(int grp = shuzu.length/2;grp>0;grp=grp/2) {//设定步长,初始为数组一半
			for(int i = grp;i<shuzu.length;i++) {//i定位当前元素(以后不断向后遍历),下标和步长一样
				for(int j = i - grp;j>=0;j=j-grp) {//j j+grp往回遍历 比较元素大小
					if(shuzu[j]>shuzu[j+grp]) {
						int temp = shuzu[j+grp];
						shuzu[j+grp] = shuzu[j];
						shuzu[j] = temp;
					}else {
						break;
					}
				}
			}
		}
	}
			

}