冒泡排序:延申的有很多种,有的是先确定最大值放到后面,有的是先确定最小值放到前边,还有就是反过来,先确定最小值的位置,但是本质都是:不断两两比较,交换位置。。。第一趟确定一个最大(最小)值放到前边(后边),第二趟,排除选的最值继续排。。。。趟数是外循环控制,交换位置的事交给内循环。
  直接选择排序:这个应该比冒泡排序快,因为它内循环只是确定最大(小)索引值,然后在外循环的内部只有一次交换最值,而冒泡排序只要值不一样,每次都要交换相对最值,下面看代码再理解一下。

  嵌套循环中,一般把外部循环的变量导入到内循环循环条件中,这样,外部循环变量变了,势必会导致内循环循环条件的改变,减少内循环次数。

  因为刚看了一个简单工厂模式,所以就用工厂模式来试着实践一下排序,含冒泡,直接选择还有一个排序反转(其实不应该归到排序接口里),由于刚刚接触工厂模式,代码中,就只是用的int[ ]型数组,没有考虑其他类型数组及正序/反序,正序/反序就是修改内循环里交换条件的大于小于改变。。

package javafirst;

/**
* 此接口定义排序方法
*
*/
interface Sort{
/**
* 排序方法
* @param arr 需要排序的int型数组
* @return 返回一个int型数组
*/
public int[] sort(int[] arr);
}
/**
*实现冒泡排序
*/
class BubbleSort implements Sort{
public int[] sort(int[] arr){
//因为外层for循环是控制循环趟数,从1开始比较直观一些
for(int i = 1; i < arr.length; i ++){
for(int k = 0; k < arr.length - i; k++){
if(arr[k] > arr[k+1]){
int temp = arr[k];
arr[k] = arr[k+1];
arr[k+1] = temp;
}
}
}
return arr;
}
}
/**
*实现直接排序
*/
class SelectSort implements Sort{
public int[] sort(int[] arr){
for(int i = 1; i < arr.length; i++){
int index = 0;
//此内循环的目的是找出最大值的索引
for(int k = 1; k <= arr.length - i; k++){
if(arr[k] > arr[index])
//这里只是交换索引,而不是交换值
index = k;
}
//当上边内循环循环完毕之后,会选出一个最大值,其索引值为index,然后与数组后边值交换位置
//这里是值得交换
int temp = arr[arr.length - i];
arr[arr.length - i] = arr[index];
arr[index] = temp;
}
return arr;
}
}
/**
*实现反转排序
*/
class ReverseSort implements Sort{
public int[] sort(int[] arr){
//就是交换数组前后的相对位置
for(int i = 0; i < arr.length / 2; i ++){
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
return arr;
}
}
/**
*排序类实例工厂
*/
class SortFactory{ /**
* 实例化
* @param sortName 排序方式
* @return 返回一个Sort实例
*/
public Sort createSort(String sortName){
String str = sortName.toLowerCase();
Sort sor = null;
switch (str){
case "bubblesort":
sor = new BubbleSort();
break;
case "selectsort":
sor = new SelectSort();
break;
case "reversesort":
sor = new ReverseSort();
break;
}
return sor;
}
}
/**
*遍历数组类
*/
class Show{
public void showArray(int[] arr){
for(int i : arr){
System.out.print(i + " ");
}
System.out.println();
}
} public class Test13 {
public static void main(String[] args){
Show show = new Show(); //使用冒泡排序
int[] arr1 = new int[]{2,4,5,3,6,1,12,14,17,22,15,18,16,12,13,18,10};
System.out.println("输出原数组:");
show.showArray(arr1);
Sort so1 = new SortFactory().createSort("BubbleSort");
int[] arrBubble = so1.sort(arr1);
System.out.println("冒泡排序结果:");
show.showArray(arrBubble); //使用直接排序
int[] arr2 = new int[]{2,4,5,3,6,1,12,14,17,22,15,18,16,12,13,18,10};
System.out.println("输出原数组:");
show.showArray(arr2);
Sort so2 = new SortFactory().createSort("SELECTSORT");
int[] arrSelect = so2.sort(arr2);
System.out.println("直接排序结果:");
show.showArray(arrSelect); //反转排序,得使用排序好的数组
Sort so3 = new SortFactory().createSort("ReverseSORT");
int[] arrReverse = so3.sort(arr2);
System.out.println("反转已排好序数组排序结果:");
show.showArray(arrReverse);
} }

  输出结果

最新文章

  1. js控制只能输入数字和控制小数的位数
  2. 免杀后门之MSF&amp;Veil-Evasion的完美结合
  3. Codeforces Round #284 (Div. 2)A B C 模拟 数学
  4. javascript动态创建script标签,加载完成后调用回调
  5. linux查看文件夹大小
  6. javascript pattern
  7. awk之7 常用函数的解析
  8. String的构造函数、析构函数和赋值函数
  9. Android Studio常见报错及处理办法
  10. poj1990树状数组
  11. win 结束占用端口的进程
  12. [Swift]LeetCode770. 基本计算器 IV | Basic Calculator IV
  13. mtools-你可能没用过的mongodb神器
  14. Jenkins+Git+Maven构建并部署war包到tomcat
  15. dskinlite(uieasy mfc界面库)使用记录1: schema验证xml
  16. 在DevExpress程序中使用PopupContainerEdit和PopupContainer实现数据展示
  17. 论文阅读笔记三十五:R-FCN:Object Detection via Region-based Fully Convolutional Networks(CVPR2016)
  18. 如何快速搭建&amp;配置本地服务器-前端技能
  19. java.security.InvalidKeyException: Illegal key size 解决办法
  20. 【BZOJ1862】[ZJOI2006]游戏排名系统 (Splay)

热门文章

  1. 如何使用VS2008打开VS2010的解决方案
  2. 洛谷 P2025 脑力大人之监听电话
  3. ORACLE使用WITH AS和HINT MATERIALIZE优化SQL解决FILTER效率低下
  4. 配置PL/SQL Developer连接server数据库
  5. 知无涯者(The Man Who Knew Infinity)
  6. Android javaMail使用imap协议接收邮件
  7. keil出现一些库函数没有定义
  8. storm原理介绍
  9. WebService--CXF与Spring的整合(jaxws:endpoint形式配置)以及客户端调用(spring配置文件形式,不需要生成客户端代码)
  10. 【b601】能量项链