java基础(16)、数组的高级应用--冒泡排序、选择排序

数组排序

目录

一.  冒泡排序

二.  选择排序

三.  优化选择排序


一.  冒泡排序

将数组元素按【从小到大排序】为例

  思路:依次对临近的两个元素对比,将最大值放在数组最后;再将剩余的元素对比,大值放在剩余元素的最后. . . 以此循环,最后元素就是按从小到大排列。

1.1.  做之前,先了解这个操作:把数组的最大值放在末尾

  将元素1和元素2对比,如果元素1的值大,则元素2和元素1的值互换(此时元素2为大值);再让元素2和元素3对比.  . ( 保留大值).  .  元素3和元素4对比 .  .  .  依次类推,对比完全部的元素后(因是按照当前元素和下一个元素进行的对比,所以当前元素为倒数第二个元素时,就可完成全部的元素对比,也就是对比了【数组长度-1次】),则最后的元素就是最大值;

1             for (int i = 0; i < arr.length - 1; i++) {
2                 //若当前元素比下一个元素大,则将这两个元素互换
3                 if(arr[i] > arr[i+1]){
4                     int temp = arr[i];
5                     arr[i] = arr[i+1];
6                     arr[i+1] = temp;
7                 }

1.2.  【1.1】的基础上,将其余的元素按照从小到大循环排序:

  使用【1.1】的方法,将剩下的元素再进行最大值的对比(对比的次数比【1.1】的少一次,就可进行剩余元素的对比);按此思路循环即可(循环一次,大值就放在【循环元素的】后面;当循环到第二个元素时,第一个元素就是最小值,也就是循环了【数组长度-1次】)。

 1         int[] arr = {1,3,5,1,2,7,9};
 2         //2、循环一次,就将一个大值放在数组后面;当循环到第二个元素时,第一个元素就已经是最小值,故循环【数组长度 - 1次】即可。
 3         for(int j = 0 ;j < arr.length - 1 ;j++){
 4             for (int i = 0; i < arr.length - 1 - j; i++) {
 5                 //1、若当前元素比下一个元素大,则将这两个元素互换
 6                 if(arr[i] > arr[i+1]){
 7                     int temp = arr[i];
 8                     arr[i] = arr[i+1];
 9                     arr[i+1] = temp;
10                 }
11             }
12         }
13         for (int i = 0; i < arr.length; i++) {
14             System.out.print(arr[i]+" ");
15         }

二.  选择排序法

将数组元素按【从小到大排序】为例

  思路:将第一个元素与之后的元素对比,若有值比其大的元素,则将这两个元素互换(保证第一个元素为最小值);然后第二个元素与之后的元素对比 . .  . 依次循环。

2.1.  做之前,先了解这个操作:将数组的最小值放在最前面

   思路:将第一个元素,与之和的元素挨个对比,期间若有值比其大的元素,则将这两个元素互换(循环到【数组长度-1次】后,则完成所有元素的对比)。

        for (int i = 0; i < arr.length - 1; i++) {
            //如果第一个元素比之后的元素大,则和其元素互换,循环完毕后,arr[0]是数组的最小值。
            if(arr[0] > arr[i+1]){
                int temp = arr[0];
                arr[0] = arr[i + 1];
                arr[i + 1] = temp;
            }
        }

2.2.  【2.1】 的基础上,将其余的元素按照从小到大循环排序:

  使用【2.1】的(内部)循环后,再将第二个元素与之后的所有元素进行对比(因是第二元素个开始,故循环的次数比【2.1】少一次),按此思路(外部)循环即可(每次循环对比的次数,都比上一次少一次)

  分析1:(外部)循环第一次,用第一个元素和其他元素对比;循环第二次,用第二个元素与其他元素对比 .  .  .    故(外部)循环的次数【i】与做对比的元素索引符合【arr[i]】

  分析2:(内部)循环对比的次数,每次比上次少一次,将外部循环的次数【i】,符合内部循环的循环初始值。 

 1         int[] arr = {1,3,5,1,2,7,9};
 2
 3         for (int j = 0; j < arr.length; j++) {
 4             //2、因每完成一次循环,下次循环次数需要少一次;外部循环的值给内部循环,可达到该效果
 5             for (int i = j; i < arr.length - 1; i++) {
 6                 //1、如果第一个元素比之后的元素大,则和其元素互换,循环完毕后,arr[j]是其在内与之后元素中的的最小值。
 7                 if(arr[j] > arr[i+1]){
 8                     int temp = arr[j];
 9                     arr[j] = arr[i + 1];
10                     arr[i + 1] = temp;
11                 }
12             }
13         }

三.   优化选择排序法

将数组元素按【从小到大排序】为例

  因选择排序法需要进行某元素与之后所有的元素对比,并进行元素互换的过程,若数组的长度很长,则元素互换需要耗费较多资源

  优化思路:再选择排序法的基础上,设置变量index(代表起点对比元素的索引),和变量value(代表起点元素的值),当出现比其值小的元素时,将该元素的值和索引赋值给变量(赋值耗费的资源大大低于元素互换);然后将代表最小值的变量索引与起点元素索引对比,若不相同,则将起点元素与最小值元素互换(这样循环下去,以较少的元素互换次数,即可完成排序)。

 1         for (int i = 0; i < arr.length - 1; i++) {
 2             int index = i;
 3             int value = arr[i];
 4             //若出现比起点元素值更好的元素,将该元素的索引和值赋给起点元素变量。
 5             for (int j = i + 1; j < arr.length; j++) {
 6                 if (value > arr[j]) {
 7                     value = arr[j];
 8                     index = j;
 9                 }
10             }
11             //若最小值的索引(index)与起点索引不同,则将最小值的元素和起点元素互换
12             if (i != index) {
13                 int temp = arr[i];
14                 arr[i] = arr[index];
15                 arr[index] = temp;
16             }
17         }


java基础(16)、数组的高级应用--冒泡排序、选择排序

原文地址:https://www.cnblogs.com/yiwanfan/p/8878661.html

时间: 2024-10-14 00:43:10

java基础(16)、数组的高级应用--冒泡排序、选择排序的相关文章

Java基础学习——数组初识(1)

Java基础学习--数组初识(1) 1什么是数组 Java中常见的一种数据结构就是数组,数组可以分为一维数组.二维数组和多维数组. 数组是由一组相同的变量组成的数据类型,数组中每个元素具有相同的数据类型,数组中的每个元素都可以用一个统一的数组名和下标来确定. 2 数组的使用 数组的一般使用步骤: 声明数组 分配内存给该数组 下面是一维数组为例: 数据类型  数组名 []: 数组名 = new 数据类型 [数据个数]: 2.1一维数组的声明与赋值 1.数组的声明 int  num [];    

Java基础16:Java多线程基础最全总结

Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进程所创建的对象资源(内存资源).java.lang.Thread对象负责统计和控制这种行为. 每个程序都至少拥有一个线程-即作为Java虚拟机(JVM)启动参数运行在主类main方法的线程.在Java虚拟机初始化过程中也可能启动其他的后台线程.这种线程的数目和种类因JVM的实现而异.然而所有用户级线

算法_基本排序算法之冒泡排序,选择排序,插入排序和希尔排序

排序的元素实现了Comparable接口,以达到对于通用性. 最基础的排序是冒泡排序,下面是其思路: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 下面是其实现代码: public class Maopao { public void sort(Comparable[]

C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序

以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序,然后是測试的样例.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序

下面列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序,然后是测试的例子.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

经典排序:冒泡排序+选择排序 小结

经典排序:冒泡排序+选择排序 例 FJUTOJ 1842 冒泡排序 原理是取相邻两个数进行大小比较,判断是否交换. 以从小到大排序为例,冒泡排序就像气泡一样,最小的数慢慢浮上来,最大的数慢慢沉下去.那么完整从头到尾做一次之后最后一位就是原序列中最大的数字了.然后只需要对1~(n-1)个数字进行排序,完成后倒数第二个数字也为原序列的1~n-1元素中最大的值.如此重复,进行n-1次一定能完成排序.参考代码: 1 #include <stdio.h> 2 void BubbleSort(int *,

java基础之数组常用操作

常用的对数组进行的操作 1.求数组中最大值,最小值 思路:假设下标为0的元素是最大值,遍历数组,依次跟max进行比较,如果有元素比这个max还大,则把这个值赋给max.最小值同样 1 public class TestArray{ 2 public static void main(String[] args){ 3 int[] arr={23,45,234,576,34,87,34,12,67}; 4 int max=arr[0]; 5 int min=arr[0]; 6 for(int i=

Java基础总结--数组

---数组的定义---组织存储一组数据1.存放相同类型数据的集合--就是一种容器本质上变量也是一种容器--区别就是只存储了一个数据的容器--面对容器,而不是分散的数据eg.买一盘鸡蛋--蛋托其实就是容器2.数组可以开始从0自动编号--进而可以通过下标方便的访问每个数据3.数组本质就是对象,数组名就是存储该数组对象的地址,数组的元素相当于对象的成员变量--会被进行默认初始化4.数组声明和初始化格式--*直接声明并初始化(静态初始化方式) int[] arr = {1,2,3};*先创建再初始化 i

黑马程序员——Java基础语法---数组

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 一.概念         同一种类型数据的集合.简单的来说就是一容器,用来装东西的. 使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素. 二.一维数组的格式 格式1:元素类型 [ ]数组名 = new 元素类型 [元素