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);
} }
输出结果

Java冒泡排序与直接选择排序代码随笔的更多相关文章
- java 冒泡排序 二分查找 选择排序 插入排序
下面这个程序是先定义一个整型数组,然后将其中的元素反序赋值,再用冒泡排序进行排序以后用二分查找来查找其中是否有某个数,返回值为-1时表示这个数可能小于这个数组的最小值或大小这个数组的最大值,-2表示这 ...
- java 冒泡排序法、选择排序
1.冒泡排序 /* * 冒泡排序 * 外层控制循环多少趟,内层控制每一趟的循环次数 */ public class Test08 { public static void main(String[] ...
- Java冒泡排序与二分法查找的代码随笔
package javafirst; import java.util.Arrays; class MaoPao{ //升序排列 /** * @param arr 要排序的数组 * @return i ...
- java基础算法之选择排序
选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. ...
- 冒泡排序Vs直接选择排序
什么是排序?为什么要使用排序?事实上我们生活中处处都用到了排序.拿字典来说,如今,我们要在字典中查找某个字(已经知道这个字的读音),首先.我们须要依据这个字的读音,找到它所所在文件夹中的位置,然后依据 ...
- 冒泡排序与简单选择排序——Java实现
1.冒泡排序 1)原理说明:反复遍历要排序的数列,一次比較两个元素,假设他们的顺序错误就把他们交换过来.走訪数列的工作是反复地进行直到没有再须要交换,也就是说该数列已经排序完毕. 2)代码实现: pa ...
- Java学习笔记day07_琐碎知识_水仙花数_ASCII码_冒泡排序_简单选择排序_折半查找
琐碎知识: 水仙花数, ASCII码, 冒泡排序, 简单选择排序, 折半查找 1.水仙花数 每位数的平方的和等于本身. 如100到999之间的水仙花数满足: 个位的平方+十位的平方+百位的平方 = 本 ...
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
- C语音中最简单的排序冒泡排序和选择排序代码实现(非指针)
#include<stdio.h> int main() { int a[5] = { 2,5,7,3,-1 }; int n = sizeof(a) / sizeof(a[0]);//元 ...
随机推荐
- Flask项目之手机端租房网站的实战开发(四)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- Docker---(3)Docker常用命令
原文:Docker---(3)Docker常用命令 版权声明:欢迎转载,请标明出处,如有问题,欢迎指正!谢谢!微信:w1186355422 https://blog.csdn.net/weixin_3 ...
- 位数(digits)的处理
主要针对:二进制表示法,以及十进制表示法: 1. 获取位数 已知该数 n 采用十进制进行表示 二进制形式的位数:⌊log2n⌋+1 十进制形式的位数:⌊log10n⌋+1 2. 截断(保留前/后 m ...
- 微信小程序实现运动步数排行(可删除)
wxml <!-- 向左滑动删除功能 --> <view class="item-box"> <view class="items" ...
- WCF学习笔记——对象序列化
当试图通过Web服务.WCF这样的远程处理技术将一个对象复制到远端时,具有对类型序列化的能力很关键. 一 序列化基础 序列化描述了持久化或传输一个对象的状态到流的过程(.NET将对象序列化到流,流是字 ...
- Web安全之Cookie劫持
1. Cookie是什么? 2. 窃取的原理是什么? 3. 系统如何防Cookie劫持呢? 看完这三个回答, 你就明白哪位传奇大侠是如何成功的!!! Cookie: HTTP天然是无状态的协议, 为了 ...
- UVA 11889 - Benefit 可直接枚举
看题传送门 题目大意: 输入两个整数A和C,求最小的整数B,使得lcm(A,B)=C.如果无解,输出NO SOLUTION 思路: A*B=C*gcd(A,B) 所以 B / gcd(A,B) = C ...
- 7.2 基础知识ArrayMap
1.android源码中维护有键值对,通过键可以找到值 Java中Object是所有类的父类,对于键值对的保存如果使用个ObjectArray数组,比如N个位置存放键,N+1的位置就存放值,那么如果键 ...
- OC学习篇之---Foundation框架中的NSObject对象
从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现 ...
- [WASM] Create and Run a Native WebAssembly Function
In this introduction, we show a simple WebAssembly function that returns the square root of a number ...