Java八大排序算法之"希尔排序(最小增量排序)"算法
2017-06-15 15:58
302 查看
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。
———————-本段来自百度百科
是插入排序的一种,只不过是效率更高.就能独立成一种算法….作为小菜鸟的我来说:
先给自己定个小目标,比如说写一个属于自己的算法.
拉倒吧,但是我倒是想到了一个把妹的纸牌游戏.
就是用13张不同的牌,其实不管多少张,只要不同数字就ok,然后,和前面的妹子互动排序.你每次拿起来两张牌只需要问谁大谁小,然后就可以用希尔算法排序了.
慎重的说一下,因为会互动很多次才能排序出来,要么少选几张牌(太少了就没有技术含量了),要么,别玩了,你们还有重要的故事要继续—>>>>康忙北鼻…
等我找个毛巾捂脸(✿◡‿◡)
对希尔算法,就是
先知道这个数组的长度n,
所以,它的一半就是n/2,如果不能整除就向上取整;
第一轮:先将数据分成两组,个数是奇数的话,向上取整.
取出来第一组的第一个数,和第二组的第一个数比较
取出来第一组的第二个数,和第二组的第二个数比较
….对应的位置比较
第一轮结束.
第二轮,根据第一轮的一半(可能向上取整了)的一半分组(第二轮不会有向上取整,肯定是偶数,1除外….);
又是第一轮的方法,取出来新的第一组的第一个数,先与第二组的第一个数比较,第一个数字大了就和第二组的第一个数互换位置.
比完了后,又将第二组的第一个数和第三组的第一个数比较.
以此类推….比到最后一个没得比了,
拿就从第一组中取出来第二个数,按照上面的方法开始往下比较…
……
……
直到>>>一半的一半的一半…等于1,就按照顺序,第一个,第二个比较看是否要换位置后,又将第二个与第三个进行比较…
比较完了就拍好序了…
妹子说,这个游戏好无聊,我不玩了.
分手 >>> /(ㄒoㄒ)/~~
程序员,活该你单身.哈哈哈
看到这么多,你肯定会蒙圈的,自己找几张扑克牌模拟一下吧.
如果是在公司的话,那就多输出一下日志就好了,我就是这么干的….哈哈哈
学会一种算法,我会装逼到底.
老铁,你等着.
———————-本段来自百度百科
是插入排序的一种,只不过是效率更高.就能独立成一种算法….作为小菜鸟的我来说:
先给自己定个小目标,比如说写一个属于自己的算法.
拉倒吧,但是我倒是想到了一个把妹的纸牌游戏.
就是用13张不同的牌,其实不管多少张,只要不同数字就ok,然后,和前面的妹子互动排序.你每次拿起来两张牌只需要问谁大谁小,然后就可以用希尔算法排序了.
慎重的说一下,因为会互动很多次才能排序出来,要么少选几张牌(太少了就没有技术含量了),要么,别玩了,你们还有重要的故事要继续—>>>>康忙北鼻…
等我找个毛巾捂脸(✿◡‿◡)
对希尔算法,就是
先知道这个数组的长度n,
所以,它的一半就是n/2,如果不能整除就向上取整;
第一轮:先将数据分成两组,个数是奇数的话,向上取整.
取出来第一组的第一个数,和第二组的第一个数比较
取出来第一组的第二个数,和第二组的第二个数比较
….对应的位置比较
第一轮结束.
第二轮,根据第一轮的一半(可能向上取整了)的一半分组(第二轮不会有向上取整,肯定是偶数,1除外….);
又是第一轮的方法,取出来新的第一组的第一个数,先与第二组的第一个数比较,第一个数字大了就和第二组的第一个数互换位置.
比完了后,又将第二组的第一个数和第三组的第一个数比较.
以此类推….比到最后一个没得比了,
拿就从第一组中取出来第二个数,按照上面的方法开始往下比较…
……
……
直到>>>一半的一半的一半…等于1,就按照顺序,第一个,第二个比较看是否要换位置后,又将第二个与第三个进行比较…
比较完了就拍好序了…
妹子说,这个游戏好无聊,我不玩了.
分手 >>> /(ㄒoㄒ)/~~
程序员,活该你单身.哈哈哈
看到这么多,你肯定会蒙圈的,自己找几张扑克牌模拟一下吧.
如果是在公司的话,那就多输出一下日志就好了,我就是这么干的….哈哈哈
package com.wangjun.sort; import java.util.Arrays; /** * 希尔排序(最小增量排序) * 基本思想: * 算法先将要排序的一组数按某个增量 d(n/2,n为要排序数的个数)分成若干组, * 每组中记录的下标相差 d.对每组中全部元素进行直接插入排序, * 然后再用一个较小的增量(d/2)对它进行分组, * 在每组中再进行直接插入排序。 * 当增量减到 1时,进行直接插入排序后,排序完成。 * * @author 王俊 * */ public class ShellSort { public static void main(String[] args) { int[] a={49,38,65,95,25,53,51}; System.out.println(Arrays.toString(a)); System.out.println("======================="); sort(a); } /** * 用希尔算法进行排序 * @param a 需要排序的数组 */ private static void sort(int[] a) { double d1=a.length; int temp=0; //开始循环 while(true){ //ceil 则是不小于他的最小整数 //每循环一次,增量就减半向上取整 d1=Math.ceil(d1/2); int d=(int)d1; //开始进行遍历数组分割出来的第一部分 for(int x=0;x<d;x++){ // System.out.println("-------"+d+"--------"); for(int i=(x+d);i<a.length;i+=d){ int j=(i-d); temp=a[i]; System.out.println("i=="+i); System.out.println("temp=="+temp); System.out.println("j=="+j); System.out.println("a[j]=="+a[j]); for(;j>=0 && temp<a[j];j-=d){ a[j+d]=a[j]; } a[j+d]=temp; } System.out.println(Arrays.toString(a)); } //当d==1的时候跳出死循环 if(d==1){ break; } } //System.out.println(Arrays.toString(a)); } }
学会一种算法,我会装逼到底.
老铁,你等着.
相关文章推荐
- 算法笔记2-排序-希尔排序(最小增量排序)
- 一点一点的积累算法JAVA版之希尔排序(最小增量排序)
- 算法【4】:希尔排序(缩小增量排序)
- 八大排序--- 希尔排序(最小增量排序)
- 插入排序) 希尔排序 (最小增量排序)
- 排序算法(二):希尔排序(最小增量排序)
- 数据结构----希尔排序(最小增量排序)
- 回首Java——希尔排序(最小增量排序)
- 希尔排序(缩小增量排序)
- 理解希尔排序,缩减增量排序
- shell排序,希尔排序,递减增量排序。
- 常见算法:C语言中的排序算法--冒泡排序,选择排序,希尔排序
- 算法基础之排序篇-希尔排序
- 排序算法之希尔排序
- 经典算法排序——希尔排序
- 插入排序的改进算法-希尔排序
- 一些竞赛算法题目及解答(角谷步数,数组非排序正负数分离, 最小方差生成树)
- 算法:一个排序(第一个最大,第二个最小,第三个其次大,第四其次小...)
- 图解"数据结构--内部排序算法"----插入排序:直接插入排序、希尔排序
- 查找""排序""简单数学计算" "简单算法"[Java实现](数据结构和算法)(复习)(持续更新