使用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实现冒泡排序代码如下,代码实现过程,用一个临时变量来做中间值,从而实现交换:

 1 package maopaopaixu;
 2
 3 import java.util.Scanner;                        //使用到了scanner函数,所以需要导包
 4
 5 public class maopao {
 6
 7     public static void main(String[] args) {
 8         int i,j,k,temp;                            //声明变量
 9         int a[]=new int[10];                    //定义一个数组,长度为10
10         Scanner sc=new Scanner(System.in);        //创建一个输入对象
11         System.out.println("请输入十个正整数:");        //输出
12         for(i=0;i<a.length;i++){                //使用for循环把数据存储到数组中
13             a[i]=sc.nextInt();
14         }
15         for(j=0;j<a.length;j++){                //外层循环控制排序趟数
16             for(k=0;k<a.length-1;k++){            //内层循环控制每一趟排序多少次
17                 if(a[k]<a[k+1]){                //取相邻两个数进行比较
18                     temp=a[k+1];                //条件为真,进行交换位置,采用temp临时变量
19                     a[k+1]=a[k];
20                     a[k]=temp;
21                 }
22             }
23         }
24         for(i=0;i<a.length;i++){                    //使用for循环,把排序的结果依次显示
25             System.out.print(a[i]+"\t");
26         }
27
28     }
29
30 }

加上一些代码可以看的更清晰,如下所示:

 1 package maopaopaixu;
 2
 3 import java.util.Scanner;                        //使用到了scanner函数,所以需要导包
 4
 5 public class maopao {
 6
 7     public static void main(String[] args) {
 8         int i,j,k,temp;                            //声明变量
 9         int a[]=new int[10];                    //定义一个数组,长度为10
10         Scanner sc=new Scanner(System.in);        //创建一个输入对象
11         System.out.println("请输入十个正整数:");        //输出
12         for(i=0;i<a.length;i++){                //使用for循环把数据存储到数组中
13             a[i]=sc.nextInt();
14         }
15         for(j=0;j<a.length;j++){                //外层循环控制排序趟数
16             for(k=0;k<a.length-1;k++){            //内层循环控制每一趟排序多少次
17                 if(a[k]<a[k+1]){                //取相邻两个数进行比较
18                     temp=a[k+1];                //条件为真,进行交换位置,采用temp临时变量
19                     a[k+1]=a[k];
20                     a[k]=temp;
21                 }
22             }
23             System.out.print("第"+(j+1)+"次排序为:");    //输出
24             for(i=0;i<a.length;i++){                //在外层循环中看每一次排序后的结果
25                 System.out.print(a[i]+"\t");
26             }
27             System.out.println();                    //换行
28         }
29         System.out.print("最终排序为:");                //输出
30         for(i=0;i<a.length;i++){                    //使用for循环,把排序的结果依次显示
31             System.out.print(a[i]+"\t");
32         }
33
34     }
35
36 }

Java实现选择排序法

基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。

在算法实现时,每一趟确定最小(或最大)元素的时候会通过不断地比较交换来使得首位置为当前最小(或最大),交换是个比较耗时的操作。其实我们很容易发现,在还未完全确定当前最小(或最大)元素之前,这些交换都是无意义的。我们可以通过设置一个变量min(或max),每一次比较仅存储较小(或较大)元素的数组下标,当轮循环结束之后,那这个变量存储的就是当前最小(或最大)元素的下标,此时再执行交换操作即可。

简言之,就是找到找到一组数中的最大与最小交换顺序

先看一张结果图,一看就明白:

输入的数据为:10, 35 67 88 99 100 2 34 77 55,我们可以从上图看出,进行第一次排序时,只是最大值100与最小值10交换了位置,其他数的位置都没有变化

同理,第二次就是该组数中的第二大的数99与第二小的数35交换位置,其他数位置不变

十次下来,就实现了排序功能

Java实现选择排序代码如下:

 1 package xuanzepaixu;
 2
 3 import java.util.Scanner;                        //使用到了scanner函数,所以需要导包
 4 /*选择比较是找出最大的与第一个交换*/
 5 public class xuanze {
 6
 7     public static void main(String[] args) {
 8         int i,j,k,temp,max,count=0;                //声明变量
 9         int a[] = new int[10];                    //定义一个数组,长度为10
10         Scanner sc=new Scanner(System.in);        //创建一个输入对象
11         System.out.println("请输入十个正整数:");        //输出
12         for(i=0;i<a.length;i++){                //使用for循环把数据存储到数组中
13             a[i]=sc.nextInt();
14         }
15         for(j=0;j<a.length;j++){                //外层循环控制排序趟数
16             max=a[j];                            //把数组中第j个值赋给max
17             count=j;                            //count记录下标,若if结果为假,则保持原样交换
18             for(k=j;k<a.length;k++){            //内层循环控制每一趟排序多少次
19                 if(max<a[k]){                    //假定的max值与数组依次去比较
20                     max=a[k];                    //为真就把a[k]的值赋给max
21                     count=k;                    //count是记录数的位置
22                 }
23             }
24             temp=a[j];                            //在外循环中对数据进行交换顺序
25             a[j]=a[count];
26             a[count]=temp;
27         }
28         for(i=0;i<a.length;i++){                    //使用for循环,把排序的结果依次显示
29             System.out.print(a[i]+"\t");
30         }
31
32     }
33
34 }

选择排序有个地方需要注意:就是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语言实现冒泡排序

实现原理都一样,只是代码写法稍有不同罢了,所以就直接上代码了:

 1 #include<stdio.h>
 2 main()
 3 {
 4     int i,j,temp;
 5     int a[10];
 6
 7     printf("请输入十个数:");
 8     for(i=0;i<10;i++)
 9     {
10         scanf("%d",&a[i]);
11     }
12
13
14     for(i=0;i<10;i++)
15     {
16         for(j=0;j<9-i;j++)
17         {
18             if(a[j]>a[j+1])
19             {
20                 temp=a[j];
21                 a[j]=a[j+1];
22                 a[j+1]=temp;
23             }
24         }
25     }
26
27     for(i=0;i<10;i++)
28     {
29         printf("a[%d]=%d\n",i,a[i]);
30     }
31 } 

C语言实现选择排序

 1 #include<stdio.h>
 2
 3 main()
 4 {
 5     int a[5],b,i,j,max,temp,count=0;
 6
 7     printf("请输入五个数:");
 8     for(i=0;i<5;i++)
 9     {
10         scanf("%d",&a[i]);
11     }
12
13     for(i=0;i<4;i++)
14     {
15         count=i;
16         for(j=0;j<4-i;j++)
17         {
18             max=a[j];
19             if(max < a[j+1])
20             {
21                 max=a[j+1];
22                 b=j+1;
23                 temp=a[j];
24                 a[j]=a[j+1];
25                 a[j+1]=temp;
26             }
27         }
28     }
29
30     for(i=0;i<5;i++)
31     {
32         printf("%d\n",a[i]);
33     }
34
35     printf("最大值为:%d",max);
36 }
本文仅代表作者观点,系作者@温一壶清酒发表。转载请注明出处:http://www.cnblogs.com/hong-fithing/
时间: 2024-08-26 13:41:49

使用C语言和Java分别实现冒泡排序和选择排序的相关文章

java面向对象的冒泡排序,选择排序和插入排序的比较

这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换  0——N2/2 = N2/4 总时间 3/4*N2 选择排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换  0——3*(N-1)=3*(N-1)/2=3/2*N 总时间 N2/2+3/2*N 插入排序:第一轮最多比较一次,第二轮最多比较俩次,最后一轮比较N-1

java——类型转换,冒泡排序,选择排序,二分查找,数组的翻转

一.类型转换 p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; text-align: justify; widows: 0; orphans: 0 } p.western { font-family: "Calibri", sans-serif; font-size: 10pt } p.cjk { font-family: "宋体"; font-size: 1

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

数组排序 目录 一. 冒泡排序 二. 选择排序 三. 优化选择排序 一. 冒泡排序 将数组元素按[从小到大排序]为例 思路:依次对临近的两个元素对比,将最大值放在数组最后:再将剩余的元素对比,大值放在剩余元素的最后. . . 以此循环,最后元素就是按从小到大排列. 1.1. 做之前,先了解这个操作:把数组的最大值放在末尾 将元素1和元素2对比,如果元素1的值大,则元素2和元素1的值互换(此时元素2为大值):再让元素2和元素3对比.  . ( 保留大值).  .  元素3和元素4对比 .  . 

冒泡排序与选择排序(经典版)----java基础总结

前言:关于冒泡排序和选择排序,每次写的时候都要再看看他们的概念,这次,就自己写明白 1.冒泡排序: 其实冒泡排序应该用例子证明,设数组长度为N. 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换. 2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就"沉"到数组第N-1个位置. 3.N=N-1,如果N不为0就重复前面二步,否则排序完成. 看了基本的方法,就写个代码验证下 1 // 2.冒泡排序 2 @Test 3 public void te

Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)

一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法. 二.划分: 划分是快速排序的前提,即把数据分为两组,大于特定值的数据在一组,小于特定值的数据在另一组.快速排序即是由划分和递归操作来完成的. (1)原理: 定义一个阈值,分别从最左面和最右面向中间遍历元素,左面找到一个大于阈值的数据便停止,右边找到一个小于阈值的数据便停止,如果此时左右两边都还没

冒泡排序和选择排序--Java

冒泡排序(Bubble sort)和选择排序(Selection sort) 初看冒泡排序和选择排序不禁会问它们有什么区别? 的确, 它们的基本思想是一样的. 都是通过一轮的循环找到所要排序数中的最值(最大值或最小值), 然后将最值置于顶端. 它们的区别主要体现在对其他数(非最值)的处理上. 冒泡排序: 通过相邻的两个数的比较, 根据需要决定是否将两个数互换位置, 然后将比较往前(或往后)推进. 例如, 要求从小到大排序. 通过将两个数比较, 将较大的数置换到右边. 如此不断循环将得到最值. 选

黑马程序员——冒泡排序和选择排序——熟悉又陌生的排序方法

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 昨天做基础测试题,遇到了个排序问题,写完后脑子里突然跳出了“冒泡排序法”这个名词.“冒泡排序法”和“选择排序法”是每个程序初学者都会学到的两个排序方法,但是好多人对这两个排序方法是既熟悉又陌生,熟悉是因为凡是遇到排序一般都会想到这两个方法,陌生是因为细细一想对这两个方法的原理和区别又不是很清楚.不较真还好,初学者一较真就很容易被这两个方法搞晕了,我当时也被这两个方法搞晕了,就又认认真真一步一步

ObjC语法练习 冒泡排序、选择排序、矩阵相乘

用OC实现的冒泡排序.选择排序.矩阵相乘,纯粹是用来练习语法. 冒泡排序,程序如下: void bubbleSort() { //初始化数组 NSMutableArray *array1 = [[NSMutableArray alloc] initWithCapacity:8]; [array1 addObject:@"5"]; [array1 addObject:@"10"]; [array1 addObject:@"8"]; [array1

#排序算法#【1】概述、冒泡排序、选择排序

排序算法分类: 内部排序(在排序过程中不需要访问外存就可以完成排序) 外部排序 内部排序分类: 交换排序 冒泡排序 快速排序 选择排序 直接选择排序 堆排序 插入排序 直接插入排序 希尔排序 合并排序 外部排序: 常见的是多路归并算法,即将原文件分为多个能够一次装入内存一部分,分别把每一部分调入内存完成排序,然后对已经排序的子文件进行归并排序 冒泡排序法: 冒泡排序法是一种相邻数据交换的排序方法. 冒泡排序法的基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键字的次序