插入算法(直接插入,二分插入,希尔)
2017-09-17 16:43
197 查看
直接插入排序(straight insertion sort)的做法是:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。
二分法插入排序是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法
实现:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止
蓝后
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。
算法思想
二分法插入排序是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法
实现:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止
蓝后
public class DirectInsert { static int[] array = {58,49,2,95,111,30,5,46,7,11,1,66,77,42,86,66,2}; public static void main(String[] args) { // TODO Auto-generated method stub PrintArray(array); InsertSort(); //直接插入排序 InsertBinarySort(); //二分插入排序 ShellSort();//希尔排序 } private static void ShellSort() { int d = array.length; // TODO Auto-generated method stub while(true){ d=d/2; for(int i=0;i<d;i++) //分为d组 { for(int k=i+d;k<array.length;k=k+d) //每组增量为d { int temp = array[k]; int j; for(j=k-d;j>=0&&array[j]>temp;j=j-d) { array[j+d]=array[j]; } array[j+d]=temp; } } if(d==1) { break; } } PrintArray(array); } private static void InsertBinarySort() { // TODO Auto-generated method stub for(int i =1;i<array.length;i++) { int low = 0; int high = i-1; int temp = array[i];// 储存array[i]的值 while (low<=high)// 未找到插入点 { int mid = (low+high)/2; if(temp<=array[mid]) //待排序数小于中间值,向左查找 { high = mid-1; } else if(temp>=array[mid]) //待排序值大于中间值,向右查找 { low = mid+1; } } for(int k=i ;k>low;k--)//将插入点之后的值右移 { array[k]=array[k-1]; } array[low]=temp; } PrintArray(array); } private static void InsertSort() { // TODO Auto-generated method stub for(int i=1;i<array.length;i++) // 从第二位开始排序 { // if(array[i]<array[i-1]) // { int temp = array[i];// 储存array[i]的数据 int j;//用于计算插入位置 for(j=i-1;j>=0 && array[j]>temp;j-- ) //查找插入位置 { array[j+1]=array[j]; //插入点之后所有元素后移 } array[j+1] = temp; //插入数据 // } } PrintArray(array); } private static void PrintArray(int[] array) { // TODO Auto-generated method stub for (int i =0; i< array.length;i++) { System.out.print(array[i]+" "); } System.out.println(""); } }
相关文章推荐
- 数据结构-排序算法之插入排序(直接插入,二分插入,希尔,表插入)
- 排序算法(选择、希尔、二分插入、冒泡、直接插入、快速排序)
- 无聊时总结总结算法之02排序(直接插入+希尔)
- 内部排序之插入排序(直接插入排序,二分插入排序,希尔插入排序)
- 白话经典算法:冒泡,直接插入,希尔,快速排序
- 第十五周项目一 - 验证算法之直接插入、希尔、冒泡排序
- 白话经典算法:冒泡,直接插入,希尔
- 直接插入算法
- 白话经典算法系列之二 直接插入排序的三种实现
- C实现三种插入排序-简单插入排序、二分插入排序、希尔插入排序
- 学Python写算法系列(一) | 直接插入排序
- 三种排序算法的C语言实现--直接插入、希尔、堆排序
- 算法实现之直接插入排序与shell排序
- 第15周项目1 -2验证算法之直接插入排序
- 第十五周项目1(1)-验证算法(直接插入排序)
- 七种排序(直接插入、折半插入、希尔、起泡、快速、简单选择、堆排序)
- 经典算法:二分查找、插入排序、选择排序、冒泡排序
- 第十五周项目1--验证算法--(2)直接插入排序
- 算法---插入排序(直接插入排序)
- 白话经典算法系列之二 直接插入排序的三种实现