冒泡排序和选择排序

1、冒泡排序

 基本思想:现在有一个数组arr= {12,35,99,18,76},需要将其从小到大排序

  1. 第一次冒泡:首先我们将数组第一个数(arr[0])和第二个数(arr[1])进行比较,如果第二个数比第一个数大,那么将两个数字进行交换,交换完成的数组是arr={35,12,99,18,76},这时候前两个数已经是满足最小的数在后面;第二步,比较第二数(arr[1])和第三个数(arr[2]),发现99比12大,则进行交换,第二步完成的数组是arr={35,99,12,18,76},以此类推,接着比较剩下来的数,最后最小的数12将来到数组的最后一位,第一次冒泡排序完的数组是arr={35,99,18,76,12}
  2. 第二次冒泡:首先还是比较第一个数和第二个数,99比35大,则进行交换,交换后数组是arr={99,35,18,76,12};第二步比较第二个数和第三个数,35比18大,则不需要进行交换,第二步后结果是arr={99,35,18,76,12};第三步比较第三个数和第四个数,18比76小,则进行交换,交换后数组是arr={99,35,76,18,12};第一次冒泡后最小的数12已经在数组的最后一位了,那么第二次冒泡则不需要比较数组最后一位数,第二次冒泡完成
  3. 第三次冒泡:排序后结果:arr={99,76,35,18,12}
  4. 第四次冒泡:排序后结果:arr={99,76,35,18,12},至此冒泡排序结束

代码:

 1 public static void BubbleSort(int[] arr) {
 2         //外层循环控制冒泡次数
 3         for(int i=0;i<arr.length;i++) {
 4             //内层循环进行比较
 5             for(int j=0;j<arr.length-i-1;j++) {
 6                 int temp=0;
 7                 //如果前一个比后一个数小,则进行交换,这里借用临时变量temp进行交换
 8                 if(arr[j]<arr[j+1]) {
 9                     temp=arr[j];
10                     arr[j]=arr[j+1];
11                     arr[j+1]=temp;
12                 }
13             }
14         }
15 }

复制

2、选择排序:

原理:每一次循环从未排序的数中找出最小的数,然后与已经排好序的数的下一个数进行交换,直到全部记录排序完毕

基本思想:给定数组:int[] arr={里面n个数据},第一次排序从arr[0]~arr[n-1]中找出最小的数据,然后将这个最小的数与arr[0]交换;第二次排序从arr[1]~arr[n-1]找出最小的数,然后将这个最小的数与arr[1]交换,以此类推,第i次排序在arr[i-1]~arr[n-1]中找出最小的数与arr[i-1]交换,直到全部排序完毕。

例子:

数组 int[] arr={2,8,3,7,5,6};

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

第一趟排序: 原始数据:2 8 3 7 5 6

最小数据2,把2放在首位,2原来就在首位,不需要交换

排序结果:2 8 3 7 5 6

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

第二趟排序: 原始数据:8 3 7 5 6(2已经排好序了,不需要再排序了)

最小数据3,8和3交换

排序结果:2 3 8 7 5 6

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

第三趟排序: 原始数据:8 7 5 6(2、3已经排好序了,不需要再排序了)

最小数据5,5和8交换

排序结果:2 3 5 7 8 6

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

第四趟排序: 原始数据:7 8 6(2、3、5已经排好序了,不需要再排序了)

最小数据6,6和7交换

排序结果:2 3 5 6 8 7

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

第五趟排序: 原始数据:8 7(2、3、5、6已经排好序了,不需要再排序了)

最小数据7,7和8交换

排序结果:2 3 5 6 7 8

排序完成

代码示例:

 1 package com.alibaba;
 2 
 3 import org.junit.jupiter.api.Test;
 4 
 5 /**
 6  * 选择排序
 7  * @author wydream
 8  *
 9  */
10 
11 public class SelectSort {
12     
13     public void sort(int[] arr) {
14         if(arr==null||arr.length==0) {
15             return;
16         }
17         
18         for(int i=0;i<arr.length;i++) {
19             int temp=arr[i];//记录最小的数
20             int flag=i;//记录最小数的下标
21             for(int j=i;j<arr.length;j++) {
22                 if(arr[j]<arr[flag]) {
23                     temp=arr[j];//和最小数交换位置
24                     flag=j;//最小数下标变化
25                 }
26             }
27             if(flag!=i) {//如果最小数不是arr[i] 则交换数据
28                 arr[flag]=arr[i];
29                 arr[i]=temp;
30             }
31         }
32     }
33     
34     @Test
35     public void test() {
36         int[] arr= {2,8,3,7,5,6};
37         sort(arr);
38         for (int i : arr) {
39             System.out.println(i);
40         }
41     }
42 
43 }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
冒泡排序选择排序都是常见的排序算法,下面分别介绍一下它们的工作原理和实现冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的两个元素并将它们按照大小顺序进行交换,直到整个列表排序完成。 冒泡排序的步骤如下: 1. 从第一个元素开始,比较相邻的两个元素。 2. 如果顺序不正确,则交换它们的位置。 3. 继续比较下一对相邻元素,直到比较完所有元素。 4. 如果还有任何交换操作发生,则重复前面的步骤。 以下是用 Python 实现冒泡排序的代码: ```python def bubble_sort(arr): n = len(arr) for i in range(n): # 每次遍历会将最大的元素冒泡到最后 for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr ``` 选择排序(Selection Sort)也是一种简单的排序算法,它每次从未排序的部分中选择最小的元素,并将其放置在已排序部分的末尾。 选择排序的步骤如下: 1. 找到未排序部分中的最小元素。 2. 将最小元素与未排序部分的第一个元素交换位置。 3. 将已排序部分的长度加1。 4. 重复上述步骤,直到整个列表排序完成。 以下是用 Python 实现选择排序的代码: ```python def selection_sort(arr): n = len(arr) for i in range(n): min_index = i # 找到未排序部分的最小元素 for j in range(i+1, n): if arr[j] < arr[min_index]: min_index = j # 将最小元素与未排序部分的第一个元素交换位置 arr[i], arr[min_index] = arr[min_index], arr[i] return arr ``` 希望对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心是凉的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值