数据结构------插入排序&&希尔排序

 

一、快速排序的思想:

        先用简单的一句话概括,每次用数组中一个数字,与他之前的所有数据进行比较,如果满足条件则更换顺序。光这么说,感觉还是有些晦涩难懂,那我们来举个例子看看吧,毕竟要学以致用呀,奥利给。

 

二、快速排序简单的实现:

1、假设我们现在有一个数组:{5,3,2,4,1}

2、那么我们需要先拿出最前面的两位----

                                                                <1>、{5,3}进行比较,并且是用最有一位向前进行比较,3<5,那么交换位置,变为{3,5}

3、那么我们需要先拿出最前面的三位----

                                                                <1>、{3,5,2}进行比价,并且是用最有一位向前进行比较,2<5,那么交换位置

                                                                <2>、变为{3,2,5},这个时候再用倒数第二位,进行比价2<3;那么交换位置,变为{2,3,5}

4、那么我们需要先拿出最前面的四位位----

                                                                  <1>、{2,3,5,4}进行比价,并且是用最有一位向前进行比较,4<5,那么交换位置,

                                                                  <2>、变为{2,3,4,5}这个时候再用倒数第二位,进行比价4>3;那么不必交换位置

                                                                  <3>、结束本次比较,返回{2,3,4,5}

5、那么我们需要先拿出最前面的五位位----

                                                                  <1>、{2,3,4,5,1}进行比价,并且是用最有一位向前进行比较,1<4,那么交换位置,

                                                                  <2>、变为{2,3,4,1,5}这个时候再用倒数第二位,进行比价1<5;那么交换位置

                                                                   <3>、变为{2,3,1,4,5},这个时候再用倒数第三位,进行比价1<3;那么交换位置,

                                                                   <4>、变为{2,1,3,4,5},这个时候再用倒数第四位,进行比价1<2;那么交换位置,

                                                                   <5>、变为{1,2,3,4,5},这个时候再用倒数第五位,没有值了。

                                                                    <6>、结束本次比较,返回{1,2,3,4,5}

 


 

三、看一下代码实现:

如果还是觉得不够清晰,那么请看代码下面的图例

   public void test1() {

        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        int data[] = new int[n + 1];

        for (int i = 0; i < n; i++) {
            data[i] = cin.nextInt();
        }

        /**
         * 总体思路
         * 比如有一个数组列:5,3,2,4,1
         *                  * 一、先拿出2个来,也就是小标是【1】的数字,头两个数字先比较,
         *                  * 二、再拿出3个来,也就是小标是【2】的数字,头三个数字先比较,
         *                  ......
         *                  N、在拿出N个来,也就是下标【n-1】的数字,N个数字进行比较,
         *                  这个时候,前面的n-1个数组都是有序的,我们只要拿着第N个数,
         *                  找到他在前面N-1个数字插入的位置,那么排序就完成了。
         */
        //外层循环控制次数,保证让后面没有拿到的数字,再比较,比如说
        //其实分步来写,就是控制每次比较的长度:
        //一、从下标【1】开始,不是从0开始,拿出前两个5,3
        //二、从下标【2】开始,拿出前三个3,5,2
        for (int i = 1; i < n; i++) {

            for (int j = i; j > 0; j--) {

                if(data[j] < data[j-1]){
                    int tmp = data[i];
                    data[i] = data[j];
                    data[j] = tmp;
                }else
                {
                    break;
                }

            }
        }


    }

 

 


 

四、下面有一幅代码执行图

 


五、希尔排序:

总体思路:还是先用一句话概括一下,希尔排序就是在快速排序的基础上,每次比较的时候将数组根据步长分为若干组。即步长有是几,我们就可以分为几组。一般我们计算步长的方法是:数组长度/2。

 

六、希尔排序思路图


七、代码实现
 

   public void test2() {

        int data[]={10,16,25,13,21,11,12,15};
        int step = data.length;
        while(step > 0) {
            step = step / 2;
            for(int i = step ; i < data.length; i ++) {
                for(int j = i ;j - step >= 0; j-= step) {
                    if(data[j] < data[j - step]) {
                        int temp = data[j];
                        data[j] = data[j - step];
                        data[j - step] = temp;
                    }else {
                        break;
                    }
                }
            }
        }
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值