使用C语言和Java分别实现冒泡排序和选择排序
经典排序算法——冒泡和选择排序法
Java实现冒泡排序
基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素放到顶端,最终达到完全有序,首先看个动图:
我们要清楚一点,冒泡排序是相邻元素的两两比较,再看下图是否会清晰些:
输入的数据为:10 30 40 33 5 78 11 100 23 66
第一次排序,从第一个数10依次比较,若10比后者小,则进行交换,当比较到5时,10比5大,所以10就停在第四个位置,再用5去比较,后面的数都比5大,所以5就排到最后了
同理,第二次排序,仍然从第一个数30开始比较,分别跟40,33交换了顺序,比到10的时候,30比10大,所以30就停在了第三个位置,再用10去比较,10只比5大,所以排在了倒数第二个位置
依次10次比较后,得到最终排序结果
Java实现冒泡排序代码如下,代码实现过程,用一个临时变量来做中间值,从而实现交换:
- package maopaopaixu;
- import java.util.Scanner; //使用到了scanner函数,所以需要导包
- public class maopao {
- public static void main(String[] args) {
- int i,j,k,temp; //声明变量
- int a[]=new int[10]; //定义一个数组,长度为10
- Scanner sc=new Scanner(System.in); //创建一个输入对象
- System.out.println("请输入十个正整数:"); //输出
- for(i=0;i<a.length;i++){ //使用for循环把数据存储到数组中
- a[i]=sc.nextInt();
- }
- for(j=0;j<a.length;j++){ //外层循环控制排序趟数
- for(k=0;k<a.length-1;k++){ //内层循环控制每一趟排序多少次
- if(a[k]<a[k+1]){ //取相邻两个数进行比较
- temp=a[k+1]; //条件为真,进行交换位置,采用temp临时变量
- a[k+1]=a[k];
- a[k]=temp;
- }
- }
- }
- for(i=0;i<a.length;i++){ //使用for循环,把排序的结果依次显示
- System.out.print(a[i]+"\t");
- }
- }
- }
加上一些代码可以看的更清晰,如下所示:
- package maopaopaixu;
- import java.util.Scanner; //使用到了scanner函数,所以需要导包
- public class maopao {
- public static void main(String[] args) {
- int i,j,k,temp; //声明变量
- int a[]=new int[10]; //定义一个数组,长度为10
- Scanner sc=new Scanner(System.in); //创建一个输入对象
- System.out.println("请输入十个正整数:"); //输出
- for(i=0;i<a.length;i++){ //使用for循环把数据存储到数组中
- a[i]=sc.nextInt();
- }
- for(j=0;j<a.length;j++){ //外层循环控制排序趟数
- for(k=0;k<a.length-1;k++){ //内层循环控制每一趟排序多少次
- if(a[k]<a[k+1]){ //取相邻两个数进行比较
- temp=a[k+1]; //条件为真,进行交换位置,采用temp临时变量
- a[k+1]=a[k];
- a[k]=temp;
- }
- }
- System.out.print("第"+(j+1)+"次排序为:"); //输出
- for(i=0;i<a.length;i++){ //在外层循环中看每一次排序后的结果
- System.out.print(a[i]+"\t");
- }
- System.out.println(); //换行
- }
- System.out.print("最终排序为:"); //输出
- for(i=0;i<a.length;i++){ //使用for循环,把排序的结果依次显示
- System.out.print(a[i]+"\t");
- }
- }
- }
Java实现选择排序法
基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。
在算法实现时,每一趟确定最小(或最大)元素的时候会通过不断地比较交换来使得首位置为当前最小(或最大),交换是个比较耗时的操作。其实我们很容易发现,在还未完全确定当前最小(或最大)元素之前,这些交换都是无意义的。我们可以通过设置一个变量min(或max),每一次比较仅存储较小(或较大)元素的数组下标,当轮循环结束之后,那这个变量存储的就是当前最小(或最大)元素的下标,此时再执行交换操作即可。
简言之,就是找到一组数中的最大值与第一个数交换顺序
先看一张结果图,一看就明白:
输入的数据为:10, 35 67 88 99 100 2 34 77 55,我们可以从上图看出,进行第一次排序时,只是最大值100与最小值10交换了位置,其他数的位置都没有变化
同理,第二次就是该组数中的第二大的数99与第二小的数35交换位置,其他数位置不变
十次下来,就实现了排序功能
Java实现选择排序代码如下:
- package xuanzepaixu;
- import java.util.Scanner; //使用到了scanner函数,所以需要导包
- /*选择比较是找出最大的与第一个交换*/
- public class xuanze {
- public static void main(String[] args) {
- int i,j,k,temp,max,count=0; //声明变量
- int a[] = new int[10]; //定义一个数组,长度为10
- Scanner sc=new Scanner(System.in); //创建一个输入对象
- System.out.println("请输入十个正整数:"); //输出
- for(i=0;i<a.length;i++){ //使用for循环把数据存储到数组中
- a[i]=sc.nextInt();
- }
- for(j=0;j<a.length;j++){ //外层循环控制排序趟数
- max=a[j]; //把数组中第j个值赋给max
- count=j; //count记录下标,若if结果为假,则保持原样交换
- for(k=j;k<a.length;k++){ //内层循环控制每一趟排序多少次
- if(max<a[k]){ //假定的max值与数组依次去比较
- max=a[k]; //为真就把a[k]的值赋给max
- count=k; //count是记录数的位置
- }
- }
- temp=a[j]; //在外循环中对数据进行交换顺序
- a[j]=a[count];
- a[count]=temp;
- }
- for(i=0;i<a.length;i++){ //使用for循环,把排序的结果依次显示
- System.out.print(a[i]+"\t");
- }
- }
- }
选择排序有个地方需要注意:就是count=j,若没有这句,当出现判断条件为假时,从而会导致整个排序出错
加上显示排序次数的代码更加清楚,如下所示:
- package xuanzepaixu;
- import java.util.Scanner; //使用到了scanner函数,所以需要导包
- /*选择比较是找出最大的与第一个交换*/
- public class xuanze {
- public static void main(String[] args) {
- int i,j,k,temp,max,count=0; //声明变量
- int a[] = new int[10]; //定义一个数组,长度为10
- Scanner sc=new Scanner(System.in); //创建一个输入对象
- System.out.println("请输入十个正整数:"); //输出
- for(i=0;i<a.length;i++){ //使用for循环把数据存储到数组中
- a[i]=sc.nextInt();
- }
- for(j=0;j<a.length;j++){ //外层循环控制排序趟数
- max=a[j]; //把数组中第j个值赋给max
- count=j; //count记录下标,若if结果为假,则保持原样交换
- for(k=j;k<a.length;k++){ //内层循环控制每一趟排序多少次
- if(max<a[k]){ //假定的max值与数组依次去比较
- max=a[k]; //为真就把a[k]的值赋给max
- count=k; //count是记录数的位置
- }
- }
- temp=a[j]; //在外循环中对数据进行交换顺序
- a[j]=a[count];
- a[count]=temp;
- System.out.print("第"+(j+1)+"次排序为:"); //输出
- for(i=0;i<a.length;i++){ //在外层循环中看每一次排序后的结果
- System.out.print(a[i]+"\t");
- }
- System.out.println(); //换行
- }
- System.out.print("最后排序为:"); //输出
- for(i=0;i<a.length;i++){ //使用for循环,把排序的结果依次显示
- System.out.print(a[i]+"\t");
- }
- }
- }
C语言实现冒泡排序
实现原理都一样,只是代码写法稍有不同罢了,所以就直接上代码了:
- #include<stdio.h>
- main()
- {
- int i,j,temp;
- int a[];
- printf("请输入十个数:");
- for(i=;i<;i++)
- {
- scanf("%d",&a[i]);
- }
- for(i=;i<;i++)
- {
- for(j=;j<-i;j++)
- {
- if(a[j]>a[j+])
- {
- temp=a[j];
- a[j]=a[j+];
- a[j+]=temp;
- }
- }
- }
- for(i=;i<;i++)
- {
- printf("a[%d]=%d\n",i,a[i]);
- }
- }
C语言实现选择排序
- #include<stdio.h>
- main()
- {
- int a[],b,i,j,max,temp,count=;
- printf("请输入五个数:");
- for(i=;i<;i++)
- {
- scanf("%d",&a[i]);
- }
- for(i=;i<;i++)
- {
- count=i;
- for(j=;j<-i;j++)
- {
- max=a[j];
- if(max < a[j+])
- {
- max=a[j+];
- b=j+;
- temp=a[j];
- a[j]=a[j+];
- a[j+]=temp;
- }
- }
- }
- for(i=;i<;i++)
- {
- printf("%d\n",a[i]);
- }
- printf("最大值为:%d",max);
- }
使用C语言和Java分别实现冒泡排序和选择排序的更多相关文章
- java面向对象的冒泡排序,选择排序和插入排序的比较
这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换 0 ...
- Java 快速排序法 冒泡排序法 选择排序法 插入排序法
1.快速排序的原理: 选择一个关键值作为基准值.比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的). 从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果 ...
- Java中的冒泡排序和选择排序
//冒泡排序 public class Test5 { public static void main(String[] args) { int[] arr = {12,2,25,89,5}; bub ...
- [Java算法] -- 1. 常用排序之冒泡排序和选择排序
使用Java语言实现冒泡排序和选择排序 推荐一个数据结构可视化的网站:http://zh.visualgo.net/zh (暂时访问不了) 对排序不太熟悉的朋友,建议去上面的网站学习一下,你将会发现一 ...
- c语言和java的区别
今晚读了一下c程序设计语言,这是一本经典书籍,发现C语言和java有很多是相同的,毕竟java是由c语言进化来的. 我大概从我自己的思考来谈谈不同点 1.c语言是面向过程,主要单位是函数,变量和函数的 ...
- c语言和java以及安卓和苹果
苹果手机是本地,没有中间环节,速度快,基于Linux系统 安卓是通过虚拟机,影响速度 就像c语言和java c适用于架构小的地方,因为直接编译运行 而java用于架构比较大的地方,启动慢,启动之后效率 ...
- Java版冒泡排序和选择排序
一.理解说明 1.理解和记忆 冒泡排序:依次定位数组元素,每次只和相邻的且符合条件的元素交换位置. 选择排序:依次在数组的每个位置,通过逐个对比选择出最大或最小的元素. 2.知识点说明 (1)数组是引 ...
- 冒泡排序、选择排序、直接插入排序、快速排序、折半查找>从零开始学JAVA系列
目录 冒泡排序.选择排序.直接插入排序 冒泡排序 选择排序 选择排序与冒泡排序的注意事项 小案例,使用选择排序完成对对象的排序 直接插入排序(插入排序) 快速排序(比较排序中效率最高的一种排序) 折半 ...
- Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次.商城商品销量排名.新闻的搜索热度排名等等.也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天, ...
随机推荐
- 《阿里巴巴Java开发手册v1.2》解析(编程规约篇)
之前在乐视天天研究各种底层高大上的东西,因为我就一个人,想怎么弄怎么弄.如今来了新美大,好好研读一下<阿里巴巴Java开发手册v1.2>.还要对这么看似简单的东西解析一番.毕竟现在带团队, ...
- 大数据平台搭建-spark集群安装
版本要求 java 版本:1.8.*(1.8.0_60) 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downl ...
- SpringMVC知识点小结
SpringMVC: 1.SpringMVC和Spring的关系: 软件开发的三层架构: web层[表示层.表现层]---->Service层---->Dao[DataBase Acces ...
- MyBatis框架——动态SQL、缓存机制、逆向工程
MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...
- Zookeeper的安装的配置
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt192 安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个 ...
- jQuery插件——ajax
一.ajax请求 1.load(url, [data], [callback]) 概述:加载远程的HTML文件代码,并插入到指定的DOM节点中. 参数:url:待装入 HTML 网页网址. data: ...
- §--------算法分界线--------§
如题 As said in the title~ 计算机的cpu计算从根源上由最基本的逻辑电路(晶体管)组成,由此衍生出最基本的数值运算:四则运算.而此后所有的高级算法都是建立在这个基本计算原理(逻辑 ...
- 团队作业7---Alpha冲刺之事后诸葛亮
一.设想与目标 1.我们的软件要解决什么问题? 我们的软件主要是帮助老师解决通过博客地址收集博客的相关信息来对学生对课程的认真与努力程度进行评定的问题,主要就是根据采集到的各项博客数据作为评分项,构建 ...
- 201521123020 《Java程序设计》第7周学习总结
1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Object o) { re ...
- 201521123026 《Java程序设计》第5周学习总结
1. 本章学习总结 尝试使用思维导图总结有关多态与接口的知识点 使用常规方法总结其他上课内容 1.接口的出现时为了实现多态,多态的实现不一定依赖于接口. 2.接口的常见成员有:全局常量和抽象方法. 3 ...