java数据结构排序之希尔排序实现
来源:互联网 发布:现货电子交易软件 编辑:程序博客网 时间:2024/05/22 17:23
早上鲜血来潮想写个希尔排序算法,发现发生了错误,一直不解,最初写的代码如下所示:
static void shellSort(int[] dataList,int dk){System.out.println("dk="+dk);for (int i = dk; i < dataList.length; i++) {int flag=i,temp=dataList[flag];for (int j = i; (j-dk) >=0; j-=dk) {<span style="color:#ff0000;">if(dataList[j] >= dataList[j-dk]){</span>break;}else{dataList[j] = dataList[j-dk];flag=j-dk;}}dataList[flag] = temp;}print(dataList);}
想调用它试试,却发现
static void print(int[] dataList){for (int j = 0; j < dataList.length; j++) {System.out.print(dataList[j]+" ");}System.out.println();}public static void main(String[] args) {int[] dataList = {13,65,97,76,38,27,49,10,0};for (int i = (dataList.length/2); i >0 ; i/=2) {shellSort(dataList, i);}}
错误原因在于红色代码注释处的判断条件,希尔排序的规则,应该以待插入的元素为依据,假如待插入的元素大小为temp,所在位置为k,增量为dk,则应该把所有满足k-=dk且k-=dk所在位置元素大于temp的元素右移dk个位置,但是上述代码却不是以temp为主来判断大小,而是以k-dk和k所在位置的元素为依据,这样最终插入temp元素的位置可能不是最合理的位置,就可能会出现如图片中显示的错误。
正确的希尔排序如下所示
正确代码1:
static void shellSort(int[] dataList,int dk){System.out.println("dk="+dk);for (int i = dk; i < dataList.length; i++) {int flag=i,temp=dataList[flag];for (int j = i; (j-dk) >=0; j-=dk) {<span style="color:#ff0000;">if(temp >= dataList[j-dk]){</span>break;}else{dataList[j] = dataList[j-dk];flag=j-dk;}}dataList[flag] = temp;}print(dataList);}正确代码2:
static void shellSort(int[] dataList,int dk){System.out.println("dk="+dk);for (int i = dk; i < dataList.length; i++) {int flag=i,temp=dataList[flag];for (int j = i-dk; j >=0; j-=dk) {System.out.println(j);<span style="color:#ff0000;">if(dataList[j]<= temp){</span>break;}else{dataList[j+dk] = dataList[j];flag=j;}}dataList[flag] = temp;}print(dataList);}注意代码红色注释处,所有的判断应与temp元素比较。
0 0
- java数据结构排序之希尔排序实现
- 数据结构之希尔排序的Java实现
- 数据结构之希尔排序------java实现
- 希尔排序之java实现
- 希尔排序之Java实现
- 数据结构之希尔排序
- 数据结构之希尔排序
- 数据结构之希尔排序
- 数据结构之希尔排序
- JAVA数据结构:希尔排序
- 数据结构--排序之希尔排序
- 数据结构之排序:希尔排序
- Java实现插入排序之希尔排序
- 排序算法之希尔排序 java实现
- 数据结构之---C语言实现希尔排序
- (十)数据结构之希尔排序算法实现
- 13. 数据结构进阶十三排序实现之希尔排序法
- 【数据结构】-直接插入排序、希尔排序Java实现
- HDU1166-敌兵布阵,线段数模板题~~
- 1oracle 自增长 2Oracle Sequence中Cache与NoCache的区别
- 获取winformGridView中选择的行列
- leetcode-338-Counting Bits
- CodeForces 217AIce Skating(DFS)
- java数据结构排序之希尔排序实现
- 命令行无法输入中文
- 【C/C++】知识回顾2
- Qt学习之给QPushButton添加菜单CustomContextMenu方法
- Linux 内存不足
- 蓝桥杯数独游戏——C语言版
- 2016年3月19日:如何让一个单网页自适应手机
- POJ 1753Flip Game
- 三层架构中使用实体类填充泛型集合代替DataTable解决方案(ASP.NET+C#)