Java数据结构之插入排序与希尔排序怎么实现
更新时间:2023-10-30前言:
插入排序和希尔排序都是基于比较的排序算法,主要是通过比较待排序元素和已排序元素的大小,将待排序元素插入到已排序元素的适当位置,从而实现对数据的排序。
插入排序是一种简单直观的排序算法,适用于小规模数据的排序。它的基本思想是通过构建有序序列,对未排序的元素进行逐个插入,最终得到一个有序序列。插入排序分为直接插入排序和二分插入排序两种。直接插入排序是通过比较和移动元素的方式实现,而二分插入排序是利用二分查找的思想来确定插入位置。
希尔排序是插入排序的一种改进算法,也称为缩小增量排序。它通过将待排序序列分割成若干子序列,对每个子序列进行插入排序,从而实现对整个序列的排序。希尔排序的主要思想是“插入排序的效率高于排序混乱序列的效率”,通过缩小增量的方式减少了数据的移动次数,从而提高了排序的效率。
插入排序的实现:
public void insertionSort(int[] arr) { int n = arr.length; for (int i = 1; i < n; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j = j - 1; } arr[j + 1] = key; } }
上述代码通过遍历待排序数组,将当前元素与已排序序列中的元素比较,并根据比较结果将当前元素插入到适当位置。具体实现过程是,首先将待排序数组的第一个元素视为已排序序列,然后依次将后续元素插入已排序序列的适当位置,直到遍历完所有元素,最终完成排序。
希尔排序的实现:
public void shellSort(int[] arr) { int n = arr.length; for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i++) { int temp = arr[i]; int j = i; while (j >= gap && arr[j - gap] > temp) { arr[j] = arr[j - gap]; j -= gap; } arr[j] = temp; } } }
上述代码通过设定一个增量gap,将待排序序列分成多个子序列,对每个子序列进行插入排序。随着增量的减小,子序列的个数增多,子序列的元素个数也逐渐减少,直到增量为1,此时整个序列变成一个有序序列,排序完成。
总结:
插入排序和希尔排序都是基于比较的排序算法,通过比较和移动元素的方式实现排序。插入排序从第二个元素开始,逐个将后续元素插入到已排序序列的适当位置,最终得到一个有序序列。希尔排序通过缩小增量的方式,将待排序序列分成多个子序列,对每个子序列进行插入排序,最终得到一个有序序列。相比于插入排序,希尔排序牺牲了稳定性,但通过减少数据移动次数,提高了排序的效率。