问题: 给你n个无序的像m的整型数 ,在客户端选择一个排序算法(快速、归并、堆)去实现数组从小到大的排序。(0 <= n <= 5 * 104,-1 * 105 <= m <= 1 * 105)
提示: 注意看代码的注释
不使用策略模式
// 如果之后增加其他排序算法,要修改核心代码
// 为sortNames增加目标排序算法的名称
// 为目标排序算法增加if/else分支
public class Client {
public static void main(String[] args) {
int[] a = {12, -10, 30, 8, 93, 102,-506};
final String[] sortNames = {"快速排序", "归并排序", "堆排序"};
System.out.println("排序算法列表");
for (int i = 0; i < sortNames.length; i++) {
System.out.println(i + ". " + sortNames[i]);
}
Scanner in = new Scanner(System.in);
System.out.print("请选择排序算法序号[0-" + (sortNames.length - 1) + "]: ");
int x = in.nextInt();
while (x < 0 || x >= sortNames.length) {
System.out.print("请选择排序算法序号[0-" + (sortNames.length - 1) + "]: ");
x = in.nextInt();
}
// 这里需要使用 if/else 判断用户选择了哪个排序算法
if (x == 0) {
System.out.println("快速排序,执行中...");
HeadSort.sort(a);
System.out.println("完成...");
} else if (x == 1) {
System.out.println("归并排序,执行中...");
MergeSort.sort(a);
System.out.println("完成...");
} else {
System.out.println("堆排序,执行中...");
MergeSort.sort(a);
System.out.println("完成...");
}
System.out.println("数组打印中...");
System.out.println(Arrays.toString(a));
System.out.println("完成...");
}
}
策略模式: 根据用户提供的不同条件,做出不同的反应。对if/else块有着非常好的消除效果。
这里通过Java枚举实现策略模式,消除if/else块对项目维护的影响。
public interface Sort {
void sort(int[] a);
}
public enum SortEnum implements Sort {
/**
*
*/
QUICK_SORT("快速排序") {
@Override
public void sort(int[] a) {
System.out.println("快速排序,执行中...");
QuickSort.sort(a);
System.out.println("完成...");
}
},
MERGE_SORT("归并排序") {
@Override
public void sort(int[] a) {
System.out.println("归并排序,执行中...");
MergeSort.sort(a);
System.out.println("完成...");
}
},
HEAD_SORT("堆排序") {
@Override
public void sort(int[] a) {
System.out.println("堆排序,执行中...");
HeadSort.sort(a);
System.out.println("完成...");
}
},
NO_SELECT_SORT("没有选择排序类型") {
@Override
public void sort(int[] a) {
System.out.println("请选择排序类型");
}
};
private final String sortName;
SortEnum(String sortName) {
this.sortName = sortName;
}
public String getSortName() {
return sortName;
}
public static SortEnum getConstantBySortName(String sortName) {
SortEnum[] constants = SortEnum.values();
for (int i = 0; i < constants.length - 1; i++) {
if (constants[i].sortName.equals(sortName)) {
return constants[i];
}
}
return SortEnum.NO_SELECT_SORT;
}
}
// 如果之后增加其他排序算法的话,不需要修改核心代码
// 只需要在SortEnum中增加一个代表目标排序算法的常量,实现Sort接口中的方法即可
public class Client {
public static void main(String[] args) {
int[] a = {12, -10, 30, 8, 93, 102,-506};
SortEnum[] constants = SortEnum.values();
int len = constants.length - 1;
final String[] sortNames = new String[len];
for (int i = 0; i < len; i++) {
sortNames[i] = constants[i].getSortName();
}
Scanner in = new Scanner(System.in);
System.out.print("请选择排序算法序号[0-" + (sortNames.length - 1) + "]: ");
int x = in.nextInt();
while (x < 0 || x >= sortNames.length) {
System.out.print("请选择排序算法序号[0-" + (sortNames.length - 1) + "]: ");
x = in.nextInt();
}
// 根据用户输入的序号,获取排序算法的名称sortName,
// 之后根据sortName,获取不同排序算法对数组a进行从小到大的排序
SortEnum.getConstantBySortName(sortNames[x]).sort(a);
System.out.println("数组打印中...");
System.out.println(Arrays.toString(a));
System.out.println("完成...");
}
}