活动地址:21天学习挑战赛

文章目录

一、冒泡排序法

1.基本思想

2.算法步骤

3.代码实践

4.复杂度分析

二、直接选择排序法

1.基本思想

2.算法步骤

3.代码实践

4.复杂度分析


一、冒泡排序法

1.基本思想

冒泡排序是一种最简单的交换排序方法。其基本思想是:通过两两比较相邻记录的关键字,如果发生逆序则进行交换,从而使关键字小的记录如气泡一般逐渐往上“漂浮”(左移),或者使关键字大的记录如石头一般逐渐往下“坠落”(右移),反复直至序列完全有序为止。

2.算法步骤

  1. 设待排序的记录存放在数组r[...n]中。首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即L.r[1].key>L.r[2].key), 则交换两个记录。然后比较第二个记录和第三个记录的关键字。依次类推,直至第n-1个记录和第n个记录的关键字进行过比较为止。上述过程称作第一趟起泡排序,其结果使得关键字最大的记录被安置到最后一个记录的位置上。
  2. 然后进行第二趟起泡排序,对前n-1个记录进行同样操作,其结果是使关键字次大的记录被安置到第n-1个记录的位置上。
  3. 重复上述比较和交换过程,第i趟是从L.r[1]到L.r[n-i+1]依次比较相邻两个记录的关键字,并在“逆序”时交换相邻记录,其结果是这n-i+1个记录中关键字最大的记录被交换到第n-i+1的位置上。直到在某一趟排序过程中没有进行过交换记录的操作,说明序列已全部达到排序要求,则完成排序。

3.代码实践

public class DayFour {public static void main(String[] args) {int []a={3,38,5,44,15,36,26,27,2,47,46,4,19,50,48};System.out.print("原无序数组为:");for (int i = 0; i <a.length ; i++) {System.out.print(a[i]+" ");}System.out.println();System.out.print("冒泡排序后:");Bubblesort(a);for (int i = 0; i <a.length ; i++) {System.out.print(a[i]+" ");}}private static  void Bubblesort(int[] a){//外出循环控制循环趟数,一共n-1趟for(int i=0;i<a.length-1;i++){//内层循环控制每一趟比较的次数 共n-1-i次比较// 因为前i个元素都已经交换完毕排序好了,得从剩下的不包括本身的n-1-i个元素中两两比较for(int j=0;j<a.length-1-i;j++){if(a[j+1]<a[j]){int temp=a[j+1];a[j+1]=a[j];a[j]=temp;}}}}
}

4.复杂度分析

(1)时间复杂度

最好情况下为正序序列,只需要进行一趟排序,在排序过程中进行n-1次关键字的比较,且不会移动记录;最坏的情况为逆序,需要进行n-1趟排序,总的关键字比较次数和记录移动的次数分别为n^2/2和(3n^2)/2 ;所以在平均情况下,其二者值为n^2/4 和(3n^2)/4

故冒泡排序的时间复杂度为O(n^2)

(2)空间复杂度

因为只有在交换记录值的时候需要一个临时的辅助空间,故冒泡排序的空间复杂度为O(1)


二、直接选择排序法

1.基本思想

直接选择排序法也叫简单选择排序法。基本思想是:每一趟从待排序的记录中选出关键字最小的记录,按照顺序放在已经排序的记录序列的最后,直到全部排完为止。

2.算法步骤

  1. 设待排序的记录存储在数组r[1...n]中。第一趟从元素r[1]开始,通过n-1次的比较,从n个记录中选出关键字最小的记录,记为r[min]。交换r[1]和r[min]
  2. 第二趟从元素r[2]开始,通过n-2次的比较,从n-1个记录中选出关键字最小的记录,记为r[min],交换r[2]和r[min]
  3. 依次类推,第i趟从r[i]开始,通过n-i次的比较,从n-i+1个记录中选出关键字最小的记录,记为r[min],交换r[ i ]和r[min]
  4. 经过n-1趟,排序完成

3.代码实践

public class DayThree {public static void main(String[] args) {int []a={5,38,47,15,36,26};System.out.print("原无序数组为:");for (int i = 0; i <a.length ; i++) {System.out.print(a[i]+" ");}System.out.println();System.out.print("直接选择排序后:");sort(a);for (int i = 0; i <a.length ; i++) {System.out.print(a[i]+" ");}}private static void sort(int []a){//外层循环控制循环执行的次数for(int i=0;i<a.length-1;i++){//假设当前位置i上的元素为最小元素,将其下标i存在min中int min=i;//内层循环负责在无序区域中找出比当前元素更小的元素并将其下标记录在min中for(int j=i+1;j<a.length;j++){if(a[j]<a[min]){min=j;//记录下标}}//如果本轮次选出的最小元素没有在它合适的位置i上则进行交换if(min!=i){int temp=a[i];a[i]=a[min];a[min]=temp;}}}
}

4.复杂度分析

(1)时间复杂度

直接选择排序过程中,所需进行记录的移动次数较少。

最好的情况是正序序列,那么不需移动任何元素;最坏的情况是逆序序列,需要移动3(n-1)次;但是,无论初始排列的序列如何,所需要进行的关键字间的比较次数相同,均为n^2/2

因此,直接选择排序的时间复杂度为O(n^2)

(2)空间复杂度

同冒泡排序一样,只有在交换记录值的时候需要一个临时的辅助空间,故直接选择排序的空间复杂度为O(1)

经典算法之冒泡排序法与直接选择排序法相关推荐

  1. 排序算法:冒泡排序、插入排序、选择排序、希尔排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...

  2. 数据结构与算法:冒泡排序、插入排序、选择排序

    排序算法太多了,有很多可能你连名字都没听说过,比如猴子排序.睡眠排序.面条排序等.本文只众多排序算法中的一小撮,也是最经典的.最常用的:冒泡排序.插入排序.选择排序.归并排序.快速排序.计数排序.基数 ...

  3. 排序算法--(冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序)

    一.时间复杂度分析 - **时间复杂度**:对排序数据的总的操作次数.反应当n变化时,操作次数呈现什么规律 - **空间复杂度**:算法在计算机内执行时所需要的存储空间的容量,它也是数据规模n的函数. ...

  4. 【经典算法6——冒泡排序】

    活动地址:CSDN21天学习挑战赛 经典算法6--冒泡排序 一.什么是排序? 二.内部排序和外部排序 三.内部排序的方法 四.交换类--冒泡排序 1.基本思想 2.实例分析 3.代码实现 4.运行结果 ...

  5. C语言排序方法-----二元选择排序法

    上一篇文章C语言排序方法-----选择排序法中分析了选择排序法,这篇文章分析一下选择排序法的优化算法,二元选择排序法,在选择排序法中每次找一个最大或者最小的数据放到开始位置,那么为了提高效率可以每次比 ...

  6. 总结c语言基础算法——冒泡排序法和选择排序法

    1.首先无论何种排序方法其最终目的是按要求将所给数据进行排序.而在C语言中可以有很多排序的方法,这里着重介绍的是常用的较为基础和重要的算法--冒泡排序法和选择排序法. 下面将举一个例子进行讲解: 要求 ...

  7. 浅谈排序算法:冒泡排序法和选择排序法的区别

    之前学习了冒泡排序法和选择排序法,最近被老师问某个道题用的是什么排序法.自己居然答不出来,才发现自己没有真正弄懂,这两个算法的原理和区别,所以····· 1冒泡排序法 1.1什么是冒泡排序法? 顾名思 ...

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

    冒泡排序法(算法):     ①.比较相邻的元素.如果第一个比第二个大,就交换它们两个:     ②.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数:   ...

  9. 冒泡排序法和选择排序法比较(从小到大,升序)

    1.冒泡排序法 冒泡法的基本思想为将相邻的两个数进行比较,并且将较大的数赋值给后面的数.(可以看做将较大的数沉底.) 举个例子,现在我们有5个数,即3 ,7,2 , 1, 5.现在我们需要用冒泡法将它 ...

最新文章

  1. Linux内核移植之一:内核源码结构与Makefile分析
  2. 布袋除尘器过滤风速多少_布袋除尘器处理风量、过滤风速、过滤面积及阻力的选型计算...
  3. Mathemmatica 新函数
  4. Centos显示-bash-4.1$问题的修复及原因探究
  5. conda 指定版本python_conda Pyhon版本切换
  6. spring MVC请求处理类注解属性详解
  7. Android延时执行调用的几种方法
  8. Java快速入门学习笔记9 | Java语言中的方法
  9. C#设计模式之5-单例模式
  10. 拖动卡顿_教你4招,让你的ps永不卡顿
  11. 又一程序员删库跑路,只不过他没跑掉,还被抓了~
  12. Code Review 是一场苦涩但有意思的修行 | 凌云时刻
  13. infoq mysql索引_MySQL 索引优化指南
  14. Alexa Voice Server 实现的 Android APK 聊天机器人
  15. 游程编码用matlab实现代码_二值图像游程编码算法的Matlab实现 -
  16. pmp中项目经理如何进行目标设定
  17. 计算简史:什么是计算机?《禅与计算机程序设计艺术》 / 陈光剑
  18. 复旦大学数学学院 18 级本科生对每周一题的评价
  19. Linux elf可执行文件加密
  20. c14cpm和dpm怎么换算_DPM7001液体闪烁计数器

热门文章

  1. 常用算法简述 -- 冒泡排序
  2. Raw expression
  3. Java log4j.additivity取消日志继承为何无效
  4. mysql默认空列的弊端
  5. JavaScript基础精讲
  6. 多地连续确诊人禽流感病例 散发病例仍可能发生
  7. k8s集群部署xxl-job-admin
  8. 丽台p1000相当于什么级别的显卡
  9. python 快速编程入门 (第2版)课后答案
  10. 使用windows自带的任务计划程序定时运行python程序(详细教程)