插入算法(直接插入、二分插入、希尔)

直接插入排序(straight insertion sort)的做法是:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。


算法思想

二分法插入排序是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法

实现:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止





蓝后





 
 
  1. public class DirectInsert {
  2. static int[] array = { 58, 49, 2, 95, 111, 30, 5, 46, 7, 11, 1, 66, 77, 42, 86, 66, 2};
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. PrintArray(array);
  6. InsertSort(); //直接插入排序
  7. InsertBinarySort(); //二分插入排序
  8. ShellSort(); //希尔排序
  9. }
  10. private static void ShellSort() {
  11. int d = array.length;
  12. // TODO Auto-generated method stub
  13. while( true){
  14. d=d/ 2;
  15. for( int i= 0;i<d;i++)   //分为d组
  16. {
  17. for( int k=i+d;k<array.length;k=k+d)   //每组增量为d
  18. {
  19. int temp = array[k];
  20. int j;
  21. for(j=k-d;j>= 0&&array[j]>temp;j=j-d)
  22. {
  23. array[j+d]=array[j];
  24. }
  25. array[j+d]=temp;
  26. }
  27. }
  28. if(d== 1)
  29. {
  30. break;
  31. }
  32. }
  33. PrintArray(array);
  34. }
  35. private static void InsertBinarySort() {
  36. // TODO Auto-generated method stub
  37. for( int i = 1;i<array.length;i++)
  38. {
  39. int low = 0;
  40. int high = i- 1;
  41. int temp = array[i]; // 储存array[i]的值
  42. while (low<=high) // 未找到插入点
  43. {
  44. int mid = (low+high)/ 2;
  45. if(temp<=array[mid]) //待排序数小于中间值,向左查找
  46. {
  47. high = mid- 1;
  48. }
  49. else if(temp>=array[mid]) //待排序值大于中间值,向右查找
  50. {
  51. low = mid+ 1;
  52. }
  53. }
  54. for( int k=i ;k>low;k--) //将插入点之后的值右移
  55. {
  56. array[k]=array[k- 1];
  57. }
  58. array[low]=temp;
  59. }
  60. PrintArray(array);
  61. }
  62. private static void InsertSort() {
  63. // TODO Auto-generated method stub
  64. for( int i= 1;i<array.length;i++) // 从第二位开始排序
  65. {
  66. // if(array[i]<array[i-1])
  67. // {
  68. int temp = array[i]; // 储存array[i]的数据
  69. int j; //用于计算插入位置
  70. for(j=i- 1;j>= 0 && array[j]>temp;j-- ) //查找插入位置
  71. {
  72. array[j+ 1]=array[j]; //插入点之后所有元素后移
  73. }
  74. array[j+ 1] = temp; //插入数据
  75. // }
  76. }
  77. PrintArray(array);
  78. }
  79. private static void PrintArray(int[] array) {
  80. // TODO Auto-generated method stub
  81. for ( int i = 0; i< array.length;i++)
  82. {
  83. System.out.print(array[i]+ " ");
  84. }
  85. System.out.println( "");
  86. }
  87. }


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值