排序之直接插入排序、拆半插入排序、希尔排序

1、直接插入排序

原理:
将待排序的元素可以分为两个区间

  1. 有序区间
  2. 无序区间

循环遍历待排序区间,每次从数组中取出一个元素,将该元素与有序区间进行比较,放入它应该在的位置。
代码实现:

//1、找待插入数据  在前面已经排好的序列中的位置;
//2、插入元素
public void insertSort(int[] arr) {
        for(int i = 1;i < arr.length;i++) {
            int key = arr[i];
            int end = i-1;
            while(end >= 0 && key < arr[end]) {
                arr[end+1] = arr[end];
                end--;
            }
            arr[end+1] = key;
        }
    }

性能分析:
稳定性:稳定
在这里插入图片描述适用于数据接近有序或元素个数少。

拆半插入排序
与上一种方法的区别:在有序区间选择数据应该插入的位置时,因为区间的有序性,可以利用折半查找的思想。

public static void bsInsertSort(int[] array) { 
	for (int i = 1; i < array.length; i++) { 
		int v = array[i]; 
		int left = 0; 
		int right = i; 
		// [left, right) 
		// 需要考虑稳定性 
		while (left < right) { 
			int m = (left + right) / 2; 
			if (v >= array[m]) { 
				left = m + 1; 
			} else { 
				right = m; 
			} 
		}
		// 搬移 
		for (int j = i; j > left; j--) { 
			array[j] = array[j - 1]; 
		}
		array[left] = v; 
	} 
}

2、希尔排序

原理:
希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

代码实现:

public static void shellSort(int[] array) { 
		int gap = array.length; 
		while (gap > 1) { 
			insertSortGap(array, gap); 
			gap = (gap / 3) + 1; // OR gap = gap / 2; 
		}
		insertSortGap(array, 1); 
	}
	private static void insertSortGap(int[] array, int gap) { 
		for (int i = 1; i < array.length; i++) { 
			int v = array[i]; 
			int j = i - gap; 
			for (; j >= 0 && array[j] > v; j -= gap) { 
				array[j + gap] = array[j]; 
			}
			Array[j+gap] = v;
		}
	}

性能分析:
稳定性:不稳定。
在这里插入图片描述适用场景:元素个数多,顺序凌乱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值