直接插入排序&希尔排序
1.直接插入排序
时间复杂度O(n2)
工作原理:
通过构建有序序列,对于未排序数据,在已排序的序列中,从后向前扫描,找到相应的位置并插入。
插入排序在实现上,在从后向前扫描的过程中,需要反复把已排序元素逐步向后移动,为最新元素提供插入空间。
//直接插入排序 public static void InsertSort(int[] a,int n){ int i,j,t; for(i=1;i<n;i++){ t=a[i];//取出一个未排序的数据 for(j=i-1;j>=0&&t<a[j];--j){//在已排序的序列这查找位置,t<a[j],说明要把t插入到前面去 a[j+1]=a[j];//向后移动数据 } a[j+1]=t;//将临时元素插入到腾出的位置中 } }
2.希尔排序
希尔排序是插入排序的一种高效率的实现,也叫缩小增量排序。简单的插入排序中,如果待排序列是正序时,时间复杂度是O(n),如果序列是基本有序的,使用直接插入排序效率就非常高。希尔排序就利用了这个特点。
基本思想是:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时再对全体记录进行一次直接插入排序。
(1)间隔的计算:
间隔h的初始值为1,通过h=3*h+1来循环计算,直到该间隔大于数组的大小时体质。最大间隔不大于数组大小的最大值,如:数组长度为10,最大间隔可以为4
(2)间隔的减少:
可以通过h=(h-1)/3来计算
package com.sort; /*希尔排序*/ public class ShellSort { public static void shellSort(int[] arr){ //初始化一个间隔 int h=0; //计算最大间隔 while (h<arr.length/3+1) {//当arr.length=10时,发现h=4时合适 h=h * 3+1; } while (h>0) { //进行插入排序 int target=0; for (int i = h; i < arr.length; i++) {//i=1是第二个数,假设第一个数的位置是正确的;要往后移,必须要假设第一个 target=arr[i];//待插入的 int j=i; //后移 while (j>h-1 && target<=arr[j-h]) { arr[j]=arr[j-h];//按间隔的距离得到要交换的两个数 j-=h; } arr[j]=target; } //减小间隔 h=(h-1)/3; } } } TestShellSort package com.sort; public class TestShellSort { public static void main(String[] args) { int[] arr=new int[9]; arr[0]=9; arr[1]=1; arr[2]=5; arr[3]=8; arr[4]=3; arr[5]=7; arr[6]=4; arr[7]=6; arr[8]=2; System.out.print("["); for (int num : arr) { System.out.print(num+" "); } System.out.print("]"); System.out.println(); ShellSort.shellSort(arr); System.out.print("["); for (int num : arr) { System.out.print(num+" "); } System.out.print("]"); System.out.println(); } }
栗子:
有些排序算法在每趟排序过程中,都会有一个元素被放置在其最终的位置上,下列算法不会出现此情况的是()
正确答案: A 你的答案: D (错误)
A.希尔排序
B.堆排序
C.起泡排序
D.快速排序