排序算法之插入排序

来源:互联网 发布:淘宝有什么功能 编辑:程序博客网 时间:2024/05/19 10:35

插入排序的基本思想是:对一个数组,从第二个元素起,每次将一个元素插入到前面已经排序的序列中。常见的插入排序法有:直接插入排序,二分法插入排序和希尔排序。

这里简要介绍下希尔排序。希尔排序基本思想是分组的直接插入排序。分组的元素个数(叫增量)这里采用减半增量,即第一趟排序每组个数为数组长度一半,第二次减半,直到最后为1.注意每组元素间隔增量的是一组。为便于理解,可以认为将全部元素排成行列式(类似于MATLAB里的reshape函数),然后同列的排序,完成后再恢复,完成一趟排序。示例如下:(这里增量用delta表示)

原数组:  38 55 65 97 27 76 27 13 19

第一趟delta=4,变为行列式:       38      55       65      97               按列排序后变为:        19     55      27     13

                                                      27     76         27      13                                                  27     76     65      97

                                                      19                                                                                   38

第二趟delta=2,变为行列式:            38      55                                    按列排序后变为:   19   13

                                                           65      97                                                                    27   55

                                                           27      76                                                                    27  76 

                                                           27      13                                                                    38    97

                                                          19                                                                                65

第三趟delta=1;此时就是一次直接插入排序,对 19 13 27 55 27 76 38 97 65  直接插入排序得到:13 19 27 27 38 55 65 76 97。排序结束。

下面是直接插入排序和希尔排序的Java代码,代码有一些辅助函数

import java.util.Random;public class insertSort {public static int[] RandomInt(int size,int bound){int[] array=new int[size];Random rm=new Random();for(int i=0;i<size;i++)array[i]=rm.nextInt(bound);return array;}static void print(int[] a){for(int ele:a)System.out.print(ele+" ");System.out.println();}public static void sort(int[] array){for(int i=1;i<array.length;i++){int tmp=array[i],j;for( j=i-1;j>=0 && array[j]>tmp;j--)      array[j+1]=array[j];array[j+1]=tmp;System.out.println("第"+i+"趟  temp="+tmp+"\t");print(array);}}static void shellSort(int[] array){for(int delta=array.length/2;delta>0;delta/=2){for(int i=delta;i<array.length;i++){int tmp=array[i],j;for( j=i-delta;j>=0 && tmp<array[j];j-=delta)array[j+delta]=array[j];array[j+delta]=tmp;}System.out.println("delta:"+delta);print(array);}}public static void main(String[] args){int[] array=insertSort.RandomInt(7, 30);//int[] array={38,55,65,97,27,76,27,13,19};System.out.println("原始数组:");insertSort.print(array);insertSort.shellSort(array);}}




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 狗狗不吃东西还拉稀怎么办 狗狗拉稀不吃饭怎么办 狗狗几天不吃东西怎么办 狗狗不吃不喝怎么办 拖鞋洗了有臭味怎么办 拖鞋湿水了很臭怎么办 棉被上渗了酸奶怎么办 酸奶弄在衣服上怎么办 孩子把褥子尿湿怎么办 小孩尿过的褥子怎么办 包包放着发霉了怎么办 被套盖久了发黄怎么办 小白鞋里面发霉怎么办 棉被淋了一点雨怎么办 苹果手机被拉进电话群怎么办 墙上的插座烧了怎么办 富士康早退4分钟怎么办 我老婆起泡疹腿剌痛睡不着了怎么办 oppo耳机孔坏了怎么办 魅族耳机口坏了怎么办 控制线的报验资料怎么办 人失踪报警派出所不管怎么办 铁板的货架久了怎么办 干镀锌让环保查了怎么办 水管软管生锈了拧不动怎么办 镀锌管会生锈吗.怎么办 冷镀锌钢管生锈了怎么办 卖了过期的东西怎么办 喝到了假的饮料怎么办 烧汤总是溢锅怎么办 脚踩垃圾桶坏了怎么办 连衣裙特别容易起褶怎么办 施肥过度烧根了怎么办 农作物施用尿素发生肥害怎么办? 水稻尿素施多了怎么办 花施肥施多了怎么办 玉米被化肥烧了怎么办 撒施复合肥没有充分融化怎么办 绿箩化肥施多了怎么办 辣椒化肥施多了怎么办? 化肥施多了烧苗怎么办