java冒泡排序输出代码_Java冒泡排序与直接选择排序代码随笔

冒泡排序:延申的有很多种,有的是先确定最大值放到后面,有的是先确定最小值放到前边,还有就是反过来,先确定最小值的位置,但是本质都是:不断两两比较,交换位置。。。第一趟确定一个最大(最小)值放到前边(后边),第二趟,排除选的最值继续排。。。。趟数是外循环控制,交换位置的事交给内循环。

直接选择排序:这个应该比冒泡排序快,因为它内循环只是确定最大(小)索引值,然后在外循环的内部只有一次交换最值,而冒泡排序只要值不一样,每次都要交换相对最值,下面看代码再理解一下。

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

因为刚看了一个简单工厂模式,所以就用工厂模式来试着实践一下排序,含冒泡,直接选择还有一个排序反转(其实不应该归到排序接口里),由于刚刚接触工厂模式,代码中,就只是用的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);

}

}

输出结果

9565cdefe5fb47879c0f5f262a552485.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值