策略设计模式(Strategy):可以整体的替换一个算法的实现部分,能够整体的替换算法,能让我们轻松地用不同方法解决同一个问题。本文将利用Strategy模式实现堆排序,感兴趣的可以学习一下
将通用算法放入具体类(HeapSorter),并将通用算法必须调用的方法定义在接口(HeapSorterHandle)中,从这个接口派生出DoubleHeapSorter并传给HeapSorter,之后就可以委托这个接口实现具体工作了。
1、图示
2、项目资产
3、源代码
接口类:HeapSortHandle
public interface HeapSorterHandle {
public void swap(int index);
public int length();
public void setArray(Object array);
public void adjustHeap(int i, int length);
}
接口派生类: DoubleHeapSorter
public class DoubleHeapSorter implements HeapSorterHandle{
private double[] array = null;
public void swap(int index)
{
double temp = array[index];
array[index] = array[0];
array[0] = temp;
}
public int length()
{
return array.length;
}
public void setArray(Object array)
{
this.array = (double[])array;
}
public void adjustHeap(int i, int length)
{
double temp = array[i];
for(int k=i*2+1;k<length;k=k*2+1)
{
if(k+1<length && array[k]<array[k+1])
{
k++;
}
if(array[k] >temp)
{
array[i] = array[k];
i = k;
}
else
{
break;
}
}
array[i] = temp;
}
}
具体算法类 HeapSorter :
public class HeapSorter {
private int length = 0;
private HeapSorterHandle itsSortHandle = null;
public HeapSorter(HeapSorterHandle handle)
{
itsSortHandle = handle;
}
public void Sort(Object array)
{
itsSortHandle.setArray(array);
length = itsSortHandle.length();
if (length <= 1) return;
for(int i=length/2-1;i>=0;i--)
{
itsSortHandle.adjustHeap(i,length);
}
for(int j=length-1;j>0;j--)
{
itsSortHandle.swap(j);
itsSortHandle.adjustHeap(0,j);
}
return;
}
}
主类Main:
import java.util.Arrays;
public class Main {
public static void main(String[] args)
{
HeapSorter HS = new HeapSorter(new DoubleHeapSorter());
double []array = {1,5,2,3,4,6,7};
System.out.println("堆排序前:"+Arrays.toString(array));
HS.Sort(array);
System.out.println("堆排序后:"+Arrays.toString(array));
}
}
输出:
注:javac -encoding UTF-8 Main.java(防止乱码)
到此这篇关于Java利用Strategy模式实现堆排序的文章就介绍到这了,更多相关Java 堆排序内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
沃梦达教程
本文标题为:Java利用Strategy模式实现堆排序
基础教程推荐
猜你喜欢
- Java实现查找文件和替换文件内容 2023-04-06
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- java基础知识之FileInputStream流的使用 2023-08-11
- springboot自定义starter方法及注解实例 2023-03-31
- java实现多人聊天系统 2023-05-19
- Java并发编程进阶之线程控制篇 2023-03-07
- Java数据结构之对象比较详解 2023-03-07
- Java文件管理操作的知识点整理 2023-05-19
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java实现线程插队的示例代码 2022-09-03