简单插入排序与希尔排序

来源:互联网 发布:iphone硬件检测软件 编辑:程序博客网 时间:2024/05/19 08:39

插入排序由N-1趟排序组成,对于p=1到N-1趟排序,插入排序保证从位置0到位置p上的元素为已排序状态。时间复杂度为O(N2), 通过交换相邻元素进行排序的任何算法平均都需要O(N2)时间。

import java.util.Arrays;public class insertionSort {public static int[] insertSort(int[] intArr) {int j;for (int i = 1; i < intArr.length; i++) {int temp = intArr[i];for (j = i; j > 0 && temp < intArr[j - 1]; j--) {intArr[j] = intArr[j - 1];}intArr[j] = temp;System.out.println(Arrays.toString(intArr));}System.out.println("--------------------------------");return intArr;}public static void main(String[] args) {int[] arr = { 34, 8, 64, 51, 32, 21 };System.out.println(Arrays.toString(insertSort(arr)));}}

简单插入排序结果:

[8, 34, 64, 51, 32, 21][8, 34, 64, 51, 32, 21][8, 34, 51, 64, 32, 21][8, 32, 34, 51, 64, 21][8, 21, 32, 34, 51, 64]--------------------------------[8, 21, 32, 34, 51, 64]

希尔排序(Shellsort):

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位
希尔排序的性能也与增量序列的选取有关,比较流行的选择是使用Shell建议的序列,int gap = intArr.length / 2; gap > 0; gap /= 2) ,使用希尔增量时希尔排序的最坏运行时间为:O(N2),使用Hibbard增量的希尔排序的最坏情形运行时间为O(N3/2)。

import java.util.Arrays;public class shellSort {public static int[] shSort(int[] intArr) {int j;for (int gap = intArr.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < intArr.length; i++) {int temp = intArr[i];for (j = i; j >= gap && temp < intArr[j - gap]; j -= gap) {intArr[j] = intArr[j - gap];}intArr[j] = temp;}System.out.println(Arrays.toString(intArr));}System.out.println("-------------------------------------------------");return intArr;}public static void main(String[] args) {int[] arr = {81, 8, 64, 51, 32, 21,19,99,11,0,3,7,5};System.out.println(Arrays.toString(shSort(arr)));}}
Shell排序结果:

[5, 8, 11, 0, 3, 7, 19, 99, 64, 51, 32, 21, 81][0, 3, 7, 5, 8, 11, 19, 32, 21, 51, 99, 64, 81][0, 3, 5, 7, 8, 11, 19, 21, 32, 51, 64, 81, 99]-------------------------------------------------[0, 3, 5, 7, 8, 11, 19, 21, 32, 51, 64, 81, 99]





0 0