1、-------寄语

对于初学JAVA的同学来说,排序是在陌生不过的一个基础题了。但是由于自己刚刚步入学习JAVA的世界,很多东西不能很好的理解,导致自己虽然可以敲出代码或者大致能够想明白,

但是对于解决问题的思想并没有很好的深入。(其实一开始学习也没必要太刨根问底,等到自己有一定的基础了,有时间了再研究一下。抱着研究的态度感觉会更好一点。其实大部分目前的

开发者都是经过了一段时间的培训,在培训的过程中,课程速度特别快,有时候我们必须要“不拘小节”,掌握培训中的主流知识才是明智之举。如果你正在培训,请记住,抓住学习主线。)

2、-------分析+代码

目前对于数组的排序有主要的两种,一种是选择排序,一种是冒泡排序。当然大学学过数据结构的知道,还有一些其他的排序,这里就不说明了,有时间自己上网查查。其实排序在开发中并不常用,

我们学习它是学一种思想,以后的业务逻辑中可能会用到,可能会有相似的逻辑或者培养了我们这种思想,我们今后可以举一反三。不要为了题目而题目,说了一些题外话,不好意思,言归正传。

(1)选择排序(从小到大)

1)思想:选择排序,让数组中的每一个数,依次与后面的数进行比较,如果前面的数大于后面的数,就进行位置的交换。这种说法或许有些人看不明白。换个说法,选择排序:第一个数依次与

后面的数比较,第一次比较完之后最小的数在最前面 。

不理解的看看图应该就差不多了,真不明白就和明白的人讨论讨论吧。

 2)代码import java.util.Arrays;/*** 练习排序-选择排序* @author Administrator**/public class Dome2 {public static void main(String[] args) {//数组int[] arr = {5,3,7,2,6,7,6,5,4,1,9,8};//第一次循环,是确定一个数依次和后面数的比较的数。for (int i = 0; i < arr.length -1 ; i++) {//这个是和第一个数的比较的数for (int j = i+1; j < arr.length; j++) {//定义一个临时的变量,用来交换变量int temp ;  if(arr[i]>arr[j]){temp =  arr[i];arr[i] = arr[j];arr[j] = temp;}}}//打印最后的排序结果
                        System.out.println(Arrays.toString(arr));}}

(2)冒泡排序(从小到大)

原理:比较两个相邻的元素,将值大的元素交换至右端。

思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。

举例说明:要排序数组:int[] arr={6,3,8,2,9,1};

第一趟排序:

    第一次排序:6和3比较,6大于3,交换位置:  3  6  8  2  9  1

    第二次排序:6和8比较,6小于8,不交换位置:3  6  8  2  9  1

    第三次排序:8和2比较,8大于2,交换位置:  3  6  2  8  9  1

    第四次排序:8和9比较,8小于9,不交换位置:3  6  2  8  9  1

    第五次排序:9和1比较:9大于1,交换位置:  3  6  2  8  1  9

    第一趟总共进行了5次比较, 排序结果:      3  6  2  8  1  9

---------------------------------------------------------------------

第二趟排序:

    第一次排序:3和6比较,3小于6,不交换位置:3  6  2  8  1  9

    第二次排序:6和2比较,6大于2,交换位置:  3  2  6  8  1  9

    第三次排序:6和8比较,6大于8,不交换位置:3  2  6  8  1  9

    第四次排序:8和1比较,8大于1,交换位置:  3  2  6  1  8  9

    第二趟总共进行了4次比较, 排序结果:      3  2  6  1  8  9

---------------------------------------------------------------------

第三趟排序:

    第一次排序:3和2比较,3大于2,交换位置:  2  3  6  1  8  9

    第二次排序:3和6比较,3小于6,不交换位置:2  3  6  1  8  9

    第三次排序:6和1比较,6大于1,交换位置:  2  3  1  6  8  9

    第二趟总共进行了3次比较, 排序结果:         2  3  1  6  8  9

---------------------------------------------------------------------

第四趟排序:

    第一次排序:2和3比较,2小于3,不交换位置:2  3  1  6  8  9

    第二次排序:3和1比较,3大于1,交换位置:  2  1  3  6  8  9

    第二趟总共进行了2次比较, 排序结果:        2  1  3  6  8  9

---------------------------------------------------------------------

第五趟排序:

    第一次排序:2和1比较,2大于1,交换位置:  1  2  3  6  8  9

    第二趟总共进行了1次比较, 排序结果:  1  2  3  6  8  9

---------------------------------------------------------------------

最终结果:1  2  3  6  8  9

---------------------------------------------------------------------

由此可见:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即

for(int i=1;i<arr.length;i++){for(int j=1;j<arr.length-i;j++){//交换位置}    

冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。

用时间复杂度来说:

  1.如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。

  2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:冒泡排序的最坏时间复杂度为:O(n2) 。

综上所述:冒泡排序总的平均时间复杂度为:O(n2) 。

代码实现:

/** 冒泡排序*/
public class BubbleSort {public static void main(String[] args) {int[] arr={6,3,8,2,9,1};System.out.println("排序前数组为:");for(int num:arr){System.out.print(num+" ");}for(int i=0;i<arr.length-1;i++){//外层循环控制排序趟数for(int j=0;j<arr.length-1-i;j++){//内层循环控制每一趟排序多少次if(arr[j]>arr[j+1]){int temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}} System.out.println();System.out.println("排序后的数组为:");for(int num:arr){System.out.print(num+" ");} }}

转载于:https://www.cnblogs.com/kebibuluan/p/8353633.html

数组排序(选择排序和冒泡排序)相关推荐

  1. java数组排序冒泡排序_java数组常见的排序——选择排序和冒泡排序

    将数组中的元素按照一定的顺序(从小到大,或从大到小)排列 1,以下用了常用的两种排序,选择排序和冒泡排序 package com.mydemo02; import java.util.Arrays; ...

  2. c 冒泡排序_C语言中选择排序和冒泡排序

    点击上方"C语言中文社区",选择"设为星标★" 技术干货第一时间送达! 来源:https://blog.csdn.net/zjy18886018024/cate ...

  3. Java小结(四)——折半查找、选择排序、冒泡排序

    最常见的一些基本算法,比如折半查找,选择排序,冒泡排序. 折半查找,是它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列     即数组内元素必须是 ...

  4. c语言入门中冒泡排序的例题,选择排序和冒泡排序例题解析(c语言)

    排序算法排序算法 1.简单选择排序简单选择排序 假设有 n 个数,作简单选择排序简单选择排序,按升序排列: 先通过 n-1 次比较,从 n 个值中找出最小值,将它与第一个值交换. 再通过 n-2 次比 ...

  5. 数据结构和算法-003 数组排序 选择排序

    选择排序 1选择排序编辑 思想 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: ①初始状态:无序区为R[1..n],有序区为空. ②第1趟排序 在无序区R[1..n]中选出关键字 ...

  6. JavaScript学习(九十三)—选择排序和冒泡排序

    JavaScript学习(九十三)-选择排序和冒泡排序 点我查看之前写过的 前端十大经典算法文章

  7. 递归算法设计 —— 选择排序和冒泡排序

    问题: 对于给定的含有n个元素的数组a,分别采用选择排序和冒泡排序 方法: 将a[0-n-1]分为有序区a[0-n-1]和无序区两个部分,有序区中的所有元素都不大于无序区中的元素,初始时有序区为空,即 ...

  8. 蛮力法查找有序数列c语言,算法——蛮力法之选择排序和冒泡排序c++实现

    这次实现的是蛮力法中的两个例子,选择排序法和冒泡排序法,使用的编译环境是vs2013,下面对这两个算法做一个简单介绍,然后是两个算法的c++实现代码. 选择排序法比较的范围是整个列表,每次扫描结束找出 ...

  9. 选择排序法和冒泡排序法

    选择排序法和冒泡排序法 1.选择排序法(以从小到大排序为例) 算法思想: A.在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 B.从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序 ...

  10. Java基础语法——选择排序、冒泡排序以及二分查找法和Arrays类的使用

    本文将带你了解选择排序.冒泡排序以及二分查找法的原理和代码实现,以及通过Arrays类快速实现对数组的一些操作 文章目录 一.选择排序 二.冒泡排序 三.二分查找法 四.Arrays类(对数组的操作) ...

最新文章

  1. oracle更改控制文件位置
  2. 关于session共享
  3. PA银行面试之炮灰之程
  4. 从 Spark Streaming 到 Apache Flink : 实时数据流在爱奇艺的演进
  5. USACO Training Section 1.2 挤牛奶Milking Cows
  6. Vue Bootstrap 静态服务器 实现文件追加上传、断点续传、极速秒传
  7. 汇编语言:实验7寻址方式在结构化数据访问中的应用
  8. Python实现视频语音和字幕自动审查功能
  9. python调包侠_sklearn调包侠之K-Means
  10. [转]Java8 Lambda表达式教程
  11. javascript ep
  12. Eclipse SVN提交代码ClientException异常解决
  13. 手把手教你用ppc手机远程控制电脑(摘自网络)
  14. python对json的操作及实例解析
  15. 强大的vim配置文件,让编程更随意【http://www.cnblogs.com/ma6174/】
  16. 分子生物学中常用数据库
  17. 背包型动态规划——零钱兑换
  18. 百度地图API入门1-申请百度API key
  19. widows下如何修改Visual Studio2017的字体颜色
  20. vim自定义设置-配置文件

热门文章

  1. Java 对象的序列化和反序列化
  2. Tomcat中web.xml文件的详细说明
  3. android 对for循环进行优化
  4. WebApp本地存储 (离线缓存策略策略)
  5. css_position
  6. 移动端测试用例设计总结-笔记
  7. 动态生成数据后绑定事件
  8. 【深度好文】多线程之WaitHandle--派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent...
  9. 1017: 成绩大排队
  10. mvc4 利用filters特性来 实现自己的权限验证 之二