基础算法-希尔排序
2017-02-23 22:21
260 查看
直接插入排序
直接插入排序就跟整理扑克牌一样,每次把一张新的牌插入到已经排好序的牌的合适的位置中。数组中排序的时候要将之前位置上的数字全部右移动一个位置,空出来的位置再来放要插入的数字。
可以一次性全部右移动一个位置,也可以这样,因为要插入的数字在已经排序的区间的右边
如果要插入的数字左边的数字比要插入的数字大,那么就跟左边的数字交换位置,这样如果到了左边位置的数字小于等于它的时候
说明它已经到了正确的位置了。
public class InsertSort { public static void insertSort(int a[],int n){ for(int i=1;i<n;i++){ for(int j=i-1;j>=0&&a[j]>a[j+1];j--){ int t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } public static void main(String[]args){ int a[]=new int[100]; SortUtil.randomArray(a); SortUtil.print(a); insertSort(a,100); SortUtil.print(a); } }
希尔排序
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
public class ShellSort { public static void shellSort(int a[],int n){ for(int g=n/2;g>0;g/=2){ for(int i=g;i<n;i++){ for (int j=i-g;j>=0&&a[j]>a[j+g];j-=g){ int t=a[j]; a[j]=a[j+g]; a[j+g]=t; } } } } public static void main(String[]args){ int a[]=new int[100]; SortUtil.randomArray(a); SortUtil.print(a); shellSort(a,100); SortUtil.print(a); } }
相关文章推荐
- 基础算法系列(七)——希尔排序
- C#算法基础之希尔排序
- 基础算法之四--排序:之希尔排序
- 算法基础-希尔排序
- 算法基础5:希尔排序(缩减增量排序算法)
- 基础算法之希尔排序
- 算法基础之----希尔排序
- 基础算法1——插入排序和希尔排序
- C++——算法基础之排序——希尔排序(已修改)
- 【基础算法】希尔排序-如何着手理解一个排序算法
- 算法基础之希尔排序
- 基础算法之三 希尔排序的实现
- 算法基础之排序篇-希尔排序
- 【算法基础】希尔排序
- 算法基础-插入排序进阶之希尔排序
- 几个基础算法介绍和实现——希尔排序
- 基础算法学习笔记(一)----回溯法
- 基础算法学习笔记(一)----回溯法
- 两个基础的算法题目
- 《实用算法的分析与程序设计》Chapt 1 基础算法